Skip to content

Commit f16e7b4

Browse files
committed
std: Fix endianness in Ord for IP addresses
The comparison of IP addresses should happen not always in network endianness but rather in the host endianness format, so be sure to convert to that before comparing addresses. There are still locations where the endianness will factor into visible properties, such as the hash, but these are not important to be independent of the endianness in play (as hash values are pretty undefined anyway. Closes #29691
1 parent 00aa3cb commit f16e7b4

File tree

1 file changed

+9
-2
lines changed

1 file changed

+9
-2
lines changed

src/libstd/net/ip.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ impl PartialOrd for Ipv4Addr {
235235
#[stable(feature = "rust1", since = "1.0.0")]
236236
impl Ord for Ipv4Addr {
237237
fn cmp(&self, other: &Ipv4Addr) -> Ordering {
238-
self.inner.s_addr.cmp(&other.inner.s_addr)
238+
self.octets().cmp(&other.octets())
239239
}
240240
}
241241

@@ -498,7 +498,7 @@ impl PartialOrd for Ipv6Addr {
498498
#[stable(feature = "rust1", since = "1.0.0")]
499499
impl Ord for Ipv6Addr {
500500
fn cmp(&self, other: &Ipv6Addr) -> Ordering {
501-
self.inner.s6_addr.cmp(&other.inner.s6_addr)
501+
self.segments().cmp(&other.segments())
502502
}
503503
}
504504

@@ -786,4 +786,11 @@ mod tests {
786786
let a = Ipv4Addr::new(127, 0, 0, 1);
787787
assert_eq!(Ipv4Addr::from(2130706433), a);
788788
}
789+
790+
#[test]
791+
fn ord() {
792+
assert!(Ipv4Addr::new(100, 64, 3, 3) < Ipv4Addr::new(192, 0, 2, 2));
793+
assert!("2001:db8:f00::1002".parse::<Ipv6Addr>().unwrap() <
794+
"2001:db8:f00::2001".parse::<Ipv6Addr>().unwrap());
795+
}
789796
}

0 commit comments

Comments
 (0)