Skip to content

Commit 03f9544

Browse files
committed
Fix windows SSL bug
1 parent d4d362a commit 03f9544

File tree

1 file changed

+28
-14
lines changed

1 file changed

+28
-14
lines changed

stdlib/src/ssl.rs

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -636,11 +636,19 @@ mod _ssl {
636636
);
637637
}
638638

639+
#[cold]
640+
fn invalid_cadata(vm: &VirtualMachine) -> PyBaseExceptionRef {
641+
vm.new_type_error(
642+
"cadata should be an ASCII string or a bytes-like object".to_owned(),
643+
)
644+
}
645+
646+
// validate cadata type and load cadata
639647
if let Some(cadata) = args.cadata {
640648
let certs = match cadata {
641649
Either::A(s) => {
642650
if !s.is_ascii() {
643-
return Err(vm.new_type_error("Must be an ascii string".to_owned()));
651+
return Err(invalid_cadata(vm));
644652
}
645653
X509::stack_from_pem(s.as_str().as_bytes())
646654
}
@@ -1191,27 +1199,33 @@ mod _ssl {
11911199
vm.new_exception_msg(cls, msg.to_owned())
11921200
}
11931201

1202+
// SSL_FILETYPE_ASN1 part of _add_ca_certs in CPython
11941203
fn x509_stack_from_der(der: &[u8]) -> Result<Vec<X509>, ErrorStack> {
11951204
unsafe {
11961205
openssl::init();
11971206
let bio = bio::MemBioSlice::new(der)?;
11981207

11991208
let mut certs = vec![];
12001209
loop {
1201-
let r = sys::d2i_X509_bio(bio.as_ptr(), std::ptr::null_mut());
1202-
if r.is_null() {
1203-
let err = sys::ERR_peek_last_error();
1204-
if sys::ERR_GET_LIB(err) == sys::ERR_LIB_ASN1
1205-
&& sys::ERR_GET_REASON(err) == sys::ASN1_R_HEADER_TOO_LONG
1206-
{
1207-
sys::ERR_clear_error();
1208-
break;
1209-
}
1210-
1211-
return Err(ErrorStack::get());
1212-
} else {
1213-
certs.push(X509::from_ptr(r));
1210+
let cert = sys::d2i_X509_bio(bio.as_ptr(), std::ptr::null_mut());
1211+
if cert.is_null() {
1212+
break;
12141213
}
1214+
certs.push(X509::from_ptr(cert));
1215+
}
1216+
1217+
let err = sys::ERR_peek_last_error();
1218+
1219+
if certs.is_empty() {
1220+
// let msg = if filetype == sys::SSL_FILETYPE_PEM {
1221+
// "no start line: cadata does not contain a certificate"
1222+
// } else {
1223+
// "not enough data: cadata does not contain a certificate"
1224+
// };
1225+
return Err(ErrorStack::get());
1226+
}
1227+
if err != 0 {
1228+
return Err(ErrorStack::get());
12151229
}
12161230

12171231
Ok(certs)

0 commit comments

Comments
 (0)