Skip to content

Commit 78c241f

Browse files
authored
Merge pull request sfackler#1799 from stephaneyfx/fix-ipaddress-debug-format
Fix debug formatting of ipaddress for GeneralName
2 parents 6d941f2 + 06581ae commit 78c241f

File tree

2 files changed

+46
-2
lines changed

2 files changed

+46
-2
lines changed

openssl/src/x509/mod.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,13 @@ use cfg_if::cfg_if;
1111
use foreign_types::{ForeignType, ForeignTypeRef, Opaque};
1212
use libc::{c_int, c_long, c_uint};
1313
use std::cmp::{self, Ordering};
14+
use std::convert::TryFrom;
1415
use std::error::Error;
1516
use std::ffi::{CStr, CString};
1617
use std::fmt;
1718
use std::marker::PhantomData;
1819
use std::mem;
20+
use std::net::IpAddr;
1921
use std::path::Path;
2022
use std::ptr;
2123
use std::slice;
@@ -1555,8 +1557,13 @@ impl fmt::Debug for GeneralNameRef {
15551557
} else if let Some(uri) = self.uri() {
15561558
formatter.write_str(uri)
15571559
} else if let Some(ipaddress) = self.ipaddress() {
1558-
let result = String::from_utf8_lossy(ipaddress);
1559-
formatter.write_str(&result)
1560+
let address = <[u8; 16]>::try_from(ipaddress)
1561+
.map(IpAddr::from)
1562+
.or_else(|_| <[u8; 4]>::try_from(ipaddress).map(IpAddr::from));
1563+
match address {
1564+
Ok(a) => fmt::Debug::fmt(&a, formatter),
1565+
Err(_) => fmt::Debug::fmt(ipaddress, formatter),
1566+
}
15601567
} else {
15611568
formatter.write_str("(empty)")
15621569
}

openssl/src/x509/tests.rs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -868,3 +868,40 @@ fn test_load_crl_file_fail() {
868868
let res = lookup.load_crl_file("test/root-ca.pem", SslFiletype::PEM);
869869
assert!(res.is_err());
870870
}
871+
872+
#[cfg(ossl110)]
873+
fn ipaddress_as_subject_alternative_name_is_formatted_in_debug<T>(expected_ip: T)
874+
where
875+
T: Into<std::net::IpAddr>,
876+
{
877+
let expected_ip = format!("{:?}", expected_ip.into());
878+
let mut builder = X509Builder::new().unwrap();
879+
let san = SubjectAlternativeName::new()
880+
.ip(&expected_ip)
881+
.build(&builder.x509v3_context(None, None))
882+
.unwrap();
883+
builder.append_extension(san).unwrap();
884+
let cert = builder.build();
885+
let actual_ip = cert
886+
.subject_alt_names()
887+
.into_iter()
888+
.flatten()
889+
.map(|n| format!("{:?}", *n))
890+
.next()
891+
.unwrap();
892+
assert_eq!(actual_ip, expected_ip);
893+
}
894+
895+
#[cfg(ossl110)]
896+
#[test]
897+
fn ipv4_as_subject_alternative_name_is_formatted_in_debug() {
898+
ipaddress_as_subject_alternative_name_is_formatted_in_debug([8u8, 8, 8, 128]);
899+
}
900+
901+
#[cfg(ossl110)]
902+
#[test]
903+
fn ipv6_as_subject_alternative_name_is_formatted_in_debug() {
904+
ipaddress_as_subject_alternative_name_is_formatted_in_debug([
905+
8u8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 128,
906+
]);
907+
}

0 commit comments

Comments
 (0)