@@ -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