Auto merge of #29724 - alexcrichton:ip-endian, r=aturon

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
This commit is contained in:
bors 2015-11-10 20:58:51 +00:00
commit 3519effc6e

View file

@ -236,7 +236,7 @@ impl PartialOrd for Ipv4Addr {
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
impl Ord for Ipv4Addr { impl Ord for Ipv4Addr {
fn cmp(&self, other: &Ipv4Addr) -> Ordering { fn cmp(&self, other: &Ipv4Addr) -> Ordering {
self.inner.s_addr.cmp(&other.inner.s_addr) self.octets().cmp(&other.octets())
} }
} }
@ -506,7 +506,7 @@ impl PartialOrd for Ipv6Addr {
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
impl Ord for Ipv6Addr { impl Ord for Ipv6Addr {
fn cmp(&self, other: &Ipv6Addr) -> Ordering { fn cmp(&self, other: &Ipv6Addr) -> Ordering {
self.inner.s6_addr.cmp(&other.inner.s6_addr) self.segments().cmp(&other.segments())
} }
} }
@ -794,4 +794,11 @@ mod tests {
let a = Ipv4Addr::new(127, 0, 0, 1); let a = Ipv4Addr::new(127, 0, 0, 1);
assert_eq!(Ipv4Addr::from(2130706433), a); assert_eq!(Ipv4Addr::from(2130706433), a);
} }
#[test]
fn ord() {
assert!(Ipv4Addr::new(100, 64, 3, 3) < Ipv4Addr::new(192, 0, 2, 2));
assert!("2001:db8:f00::1002".parse::<Ipv6Addr>().unwrap() <
"2001:db8:f00::2001".parse::<Ipv6Addr>().unwrap());
}
} }