Skip to content

Commit f60f4b7

Browse files
author
Abhishek Chanda
committed
Fix check for globally routable IPv4 address
- Adds two more functions for broadcast address and special address classes reserved for documentation - Modifies the globally routable IP check to include these new functions Fixes #24314
1 parent 67a8f61 commit f60f4b7

File tree

2 files changed

+43
-15
lines changed

2 files changed

+43
-15
lines changed

src/libstd/net/addr.rs

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -615,7 +615,7 @@ mod tests {
615615
fn ipv4_properties() {
616616
fn check(octets: &[u8; 4], unspec: bool, loopback: bool,
617617
private: bool, link_local: bool, global: bool,
618-
multicast: bool) {
618+
multicast: bool, broadcast: bool, documentation: bool) {
619619
let ip = Ipv4Addr::new(octets[0], octets[1], octets[2], octets[3]);
620620
assert_eq!(octets, &ip.octets());
621621

@@ -625,20 +625,23 @@ mod tests {
625625
assert_eq!(ip.is_link_local(), link_local);
626626
assert_eq!(ip.is_global(), global);
627627
assert_eq!(ip.is_multicast(), multicast);
628+
assert_eq!(ip.is_broadcast(), broadcast);
629+
assert_eq!(ip.is_documentation(), documentation);
628630
}
629631

630-
// address unspec loopbk privt linloc global multicast
631-
check(&[0, 0, 0, 0], true, false, false, false, true, false);
632-
check(&[0, 0, 0, 1], false, false, false, false, true, false);
633-
check(&[1, 0, 0, 0], false, false, false, false, true, false);
634-
check(&[10, 9, 8, 7], false, false, true, false, false, false);
635-
check(&[127, 1, 2, 3], false, true, false, false, false, false);
636-
check(&[172, 31, 254, 253], false, false, true, false, false, false);
637-
check(&[169, 254, 253, 242], false, false, false, true, false, false);
638-
check(&[192, 168, 254, 253], false, false, true, false, false, false);
639-
check(&[224, 0, 0, 0], false, false, false, false, true, true);
640-
check(&[239, 255, 255, 255], false, false, false, false, true, true);
641-
check(&[255, 255, 255, 255], false, false, false, false, true, false);
632+
// address unspec loopbk privt linloc global multicast brdcast doc
633+
check(&[0, 0, 0, 0], true, false, false, false, true, false, false, false);
634+
check(&[0, 0, 0, 1], false, false, false, false, true, false, false, false);
635+
check(&[1, 0, 0, 0], false, false, false, false, true, false, false, false);
636+
check(&[10, 9, 8, 7], false, false, true, false, false, false, false, false);
637+
check(&[127, 1, 2, 3], false, true, false, false, false, false, false, false);
638+
check(&[172, 31, 254, 253], false, false, true, false, false, false, false, false);
639+
check(&[169, 254, 253, 242], false, false, false, true, false, false, false, false);
640+
check(&[192, 168, 254, 253], false, false, true, false, false, false, false, false);
641+
check(&[224, 0, 0, 0], false, false, false, false, true, true, false, false);
642+
check(&[239, 255, 255, 255], false, false, false, false, true, true, false, false);
643+
check(&[255, 255, 255, 255], false, false, false, false, false, false, true, false);
644+
check(&[198, 51, 100, 0], false, false, false, false, false, false, false, true);
642645
}
643646

644647
#[test]

src/libstd/net/ip.rs

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,9 +115,11 @@ impl Ipv4Addr {
115115
///
116116
/// Non-globally-routable networks include the private networks (10.0.0.0/8,
117117
/// 172.16.0.0/12 and 192.168.0.0/16), the loopback network (127.0.0.0/8),
118-
/// and the link-local network (169.254.0.0/16).
118+
/// the link-local network (169.254.0.0/16), the broadcast address (255.255.255.255/32) and
119+
/// the test networks used for documentation (192.0.2.0/24, 198.51.100.0/24 and 203.0.113.0/24)
119120
pub fn is_global(&self) -> bool {
120-
!self.is_private() && !self.is_loopback() && !self.is_link_local()
121+
!self.is_private() && !self.is_loopback() && !self.is_link_local() &&
122+
!self.is_broadcast() && !self.is_documentation()
121123
}
122124

123125
/// Returns true if this is a multicast address.
@@ -127,6 +129,29 @@ impl Ipv4Addr {
127129
self.octets()[0] >= 224 && self.octets()[0] <= 239
128130
}
129131

132+
/// Returns true if this is a broadcast address.
133+
///
134+
/// A broadcast address has all octets set to 255 as defined in RFC 919
135+
pub fn is_broadcast(&self) -> bool {
136+
self.octets()[0] == 255 && self.octets()[1] == 255 &&
137+
self.octets()[2] == 255 && self.octets()[3] == 255
138+
}
139+
140+
/// Returns true if this address is in a range designated for documentation
141+
///
142+
/// This is defined in RFC 5737
143+
/// - 192.0.2.0/24 (TEST-NET-1)
144+
/// - 198.51.100.0/24 (TEST-NET-2)
145+
/// - 203.0.113.0/24 (TEST-NET-3)
146+
pub fn is_documentation(&self) -> bool {
147+
match(self.octets()[0], self.octets()[1], self.octets()[2], self.octets()[3]) {
148+
(192, _, 2, _) => true,
149+
(198, 51, 100, _) => true,
150+
(203, _, 113, _) => true,
151+
_ => false
152+
}
153+
}
154+
130155
/// Convert this address to an IPv4-compatible IPv6 address
131156
///
132157
/// a.b.c.d becomes ::a.b.c.d

0 commit comments

Comments
 (0)