Skip to content

Commit 78aa9aa

Browse files
committed
Always provide an X509V3Context in X509Extension::new because OpenSSL requires it for some extensions (and segfaults without)
1 parent 332311b commit 78aa9aa

File tree

2 files changed

+45
-5
lines changed

2 files changed

+45
-5
lines changed

openssl/src/x509/mod.rs

+36-4
Original file line numberDiff line numberDiff line change
@@ -816,14 +816,30 @@ impl X509Extension {
816816
) -> Result<X509Extension, ErrorStack> {
817817
let name = CString::new(name).unwrap();
818818
let value = CString::new(value).unwrap();
819+
let mut ctx;
819820
unsafe {
820821
ffi::init();
821822
let conf = conf.map_or(ptr::null_mut(), ConfRef::as_ptr);
822-
let context = context.map_or(ptr::null_mut(), X509v3Context::as_ptr);
823+
let context_ptr = match context {
824+
Some(c) => c.as_ptr(),
825+
None => {
826+
ctx = mem::zeroed();
827+
828+
ffi::X509V3_set_ctx(
829+
&mut ctx,
830+
ptr::null_mut(),
831+
ptr::null_mut(),
832+
ptr::null_mut(),
833+
ptr::null_mut(),
834+
0,
835+
);
836+
&mut ctx
837+
}
838+
};
823839
let name = name.as_ptr() as *mut _;
824840
let value = value.as_ptr() as *mut _;
825841

826-
cvt_p(ffi::X509V3_EXT_nconf(conf, context, name, value)).map(X509Extension)
842+
cvt_p(ffi::X509V3_EXT_nconf(conf, context_ptr, name, value)).map(X509Extension)
827843
}
828844
}
829845

@@ -841,14 +857,30 @@ impl X509Extension {
841857
value: &str,
842858
) -> Result<X509Extension, ErrorStack> {
843859
let value = CString::new(value).unwrap();
860+
let mut ctx;
844861
unsafe {
845862
ffi::init();
846863
let conf = conf.map_or(ptr::null_mut(), ConfRef::as_ptr);
847-
let context = context.map_or(ptr::null_mut(), X509v3Context::as_ptr);
864+
let context_ptr = match context {
865+
Some(c) => c.as_ptr(),
866+
None => {
867+
ctx = mem::zeroed();
868+
869+
ffi::X509V3_set_ctx(
870+
&mut ctx,
871+
ptr::null_mut(),
872+
ptr::null_mut(),
873+
ptr::null_mut(),
874+
ptr::null_mut(),
875+
0,
876+
);
877+
&mut ctx
878+
}
879+
};
848880
let name = name.as_raw();
849881
let value = value.as_ptr() as *mut _;
850882

851-
cvt_p(ffi::X509V3_EXT_nconf_nid(conf, context, name, value)).map(X509Extension)
883+
cvt_p(ffi::X509V3_EXT_nconf_nid(conf, context_ptr, name, value)).map(X509Extension)
852884
}
853885
}
854886

openssl/src/x509/tests.rs

+9-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ use crate::x509::X509PurposeId;
2525
#[cfg(any(ossl102, libressl261))]
2626
use crate::x509::X509PurposeRef;
2727
use crate::x509::{
28-
CrlStatus, X509Crl, X509Name, X509Req, X509StoreContext, X509VerifyResult, X509,
28+
CrlStatus, X509Crl, X509Extension, X509Name, X509Req, X509StoreContext, X509VerifyResult, X509,
2929
};
3030
use hex::{self, FromHex};
3131
#[cfg(any(ossl102, libressl261))]
@@ -287,6 +287,14 @@ fn x509_builder() {
287287
assert_eq!(serial, x509.serial_number().to_bn().unwrap());
288288
}
289289

290+
#[test]
291+
fn x509_extension_new() {
292+
assert!(X509Extension::new(None, None, "crlDistributionPoints", "section").is_err());
293+
assert!(X509Extension::new(None, None, "proxyCertInfo", "").is_err());
294+
assert!(X509Extension::new(None, None, "certificatePolicies", "").is_err());
295+
assert!(X509Extension::new(None, None, "subjectAltName", "dirName:section").is_err());
296+
}
297+
290298
#[test]
291299
fn x509_extension_to_der() {
292300
let builder = X509::builder().unwrap();

0 commit comments

Comments
 (0)