about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorkennytm <kennytm@gmail.com>2017-12-20 21:21:53 +0800
committerGitHub <noreply@github.com>2017-12-20 21:21:53 +0800
commit76e2cc56e2f514d7f53871121ef0c826b445a772 (patch)
treec0debfcfd7a3a6c79abccc5e7c4fe212df7b7c41 /src/libstd
parentc3241b504f312b9947cd2b4c11e7f4fe46dcf697 (diff)
parentbd1cf04ca7b9ffb3654aaa6c0b3106d6a381bc7f (diff)
downloadrust-76e2cc56e2f514d7f53871121ef0c826b445a772.tar.gz
rust-76e2cc56e2f514d7f53871121ef0c826b445a772.zip
Rollup merge of #46671 - varkor:contrib-2, r=KodrAus
Reject superfluous `::` in IPv6 addresses

Fixes #46263.
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/net/ip.rs3
-rw-r--r--src/libstd/net/parser.rs4
2 files changed, 6 insertions, 1 deletions
diff --git a/src/libstd/net/ip.rs b/src/libstd/net/ip.rs
index c832f8a934d..0d73a6f4fd7 100644
--- a/src/libstd/net/ip.rs
+++ b/src/libstd/net/ip.rs
@@ -1451,6 +1451,9 @@ mod tests {
         // two double colons
         let none: Option<Ipv6Addr> = "1:2::6::8".parse().ok();
         assert_eq!(None, none);
+        // `::` indicating zero groups of zeros
+        let none: Option<Ipv6Addr> = "1:2:3:4::5:6:7:8".parse().ok();
+        assert_eq!(None, none);
     }
 
     #[test]
diff --git a/src/libstd/net/parser.rs b/src/libstd/net/parser.rs
index 9f7125fb935..261d44eebaa 100644
--- a/src/libstd/net/parser.rs
+++ b/src/libstd/net/parser.rs
@@ -246,7 +246,9 @@ impl<'a> Parser<'a> {
         }
 
         let mut tail = [0; 8];
-        let (tail_size, _) = read_groups(self, &mut tail, 8 - head_size);
+        // `::` indicates one or more groups of 16 bits of zeros
+        let limit = 8 - (head_size + 1);
+        let (tail_size, _) = read_groups(self, &mut tail, limit);
         Some(ipv6_addr_from_head_tail(&head[..head_size], &tail[..tail_size]))
     }