From 5b09d82d43eb3ef6e72ea1d22a7a915ece1ea68d Mon Sep 17 00:00:00 2001 From: Michal 'vorner' Vaner Date: Sat, 7 Dec 2019 21:24:19 +0100 Subject: [PATCH] Fix bug with overflow in iterator --- src/ipv4.rs | 18 +++++++++--------- src/ipv6.rs | 16 ++++++++-------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/ipv4.rs b/src/ipv4.rs index 015c1f4..9a8578c 100644 --- a/src/ipv4.rs +++ b/src/ipv4.rs @@ -62,8 +62,8 @@ impl Ipv4Network { /// addresses. pub fn iter(&self) -> Ipv4NetworkIterator { let start = u32::from(self.network()); - let end = start + self.size(); - Ipv4NetworkIterator { next: start, end } + let end = start + (self.size() - 1); + Ipv4NetworkIterator { next: Some(start), end } } pub fn ip(&self) -> Ipv4Addr { @@ -255,7 +255,7 @@ impl From for Ipv4Network { #[derive(Clone, Debug)] pub struct Ipv4NetworkIterator { - next: u32, + next: Option, end: u32, } @@ -263,13 +263,13 @@ impl Iterator for Ipv4NetworkIterator { type Item = Ipv4Addr; fn next(&mut self) -> Option { - if self.next < self.end { - let next = Ipv4Addr::from(self.next as u32); - self.next += 1; - Some(next) - } else { + let next = self.next?; + self.next = if next == self.end { None - } + } else { + Some(next + 1) + }; + Some(next.into()) } } diff --git a/src/ipv6.rs b/src/ipv6.rs index 800ef8c..5ddcf73 100644 --- a/src/ipv6.rs +++ b/src/ipv6.rs @@ -70,7 +70,7 @@ impl Ipv6Network { let end: u128 = dec | mask; Ipv6NetworkIterator { - next: start, + next: Some(start), end: end, } } @@ -229,7 +229,7 @@ impl From for Ipv6Network { #[derive(Clone, Debug)] pub struct Ipv6NetworkIterator { - next: u128, + next: Option, end: u128, } @@ -237,13 +237,13 @@ impl Iterator for Ipv6NetworkIterator { type Item = Ipv6Addr; fn next(&mut self) -> Option { - if self.next <= self.end { - let next = Ipv6Addr::from(self.next); - self.next += 1; - Some(next) - } else { + let next = self.next?; + self.next = if next == self.end { None - } + } else { + Some(next + 1) + }; + Some(next.into()) } }