From 8976ad7ecbd6a0c70749e3bef9c508d0bfde02d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20C=C3=A1ceres?= Date: Wed, 30 Aug 2023 22:39:15 +0000 Subject: [PATCH] std.net: Fix IPv6 address parsing for single digit This fixes the case where IPv6 address parsing incorrectly succeeded on input such as `1`, which now returns error.Incomplete. --- lib/std/net.zig | 3 +++ lib/std/net/test.zig | 3 +++ 2 files changed, 6 insertions(+) diff --git a/lib/std/net.zig b/lib/std/net.zig index b03c7e09dc384f731fc986034ae4cedddbf2c949..b6f0f20f2cda0682e2c91151ce45f8faf615cda9 100644 --- a/lib/std/net.zig +++ b/lib/std/net.zig @@ -406,6 +406,9 @@ pub const Ip6Address = extern struct { if (!saw_any_digits and !abbrv) { return error.Incomplete; } + if (!abbrv and index < 14) { + return error.Incomplete; + } if (index == 14) { ip_slice[14] = @as(u8, @truncate(x >> 8)); diff --git a/lib/std/net/test.zig b/lib/std/net/test.zig index 817d6c2593d7051b22bd2d5e4eb86935f9f8f07e..fd92c64f35eb3fe7f1193b718bc107bfb2563d5e 100644 --- a/lib/std/net/test.zig +++ b/lib/std/net/test.zig @@ -13,6 +13,7 @@ test "parse and render IPv6 addresses" { "FF01::Fb", "::1", "::", + "1::", "2001:db8::", "::1234:5678", "2001:db8::1234:5678", @@ -24,6 +25,7 @@ test "parse and render IPv6 addresses" { "ff01::fb", "::1", "::", + "1::", "2001:db8::", "::1234:5678", "2001:db8::1234:5678", @@ -48,6 +50,7 @@ test "parse and render IPv6 addresses" { try testing.expectError(error.InvalidEnd, net.Address.parseIp6("FF01:0:0:0:0:0:0:FB:", 0)); try testing.expectError(error.Incomplete, net.Address.parseIp6("FF01:", 0)); try testing.expectError(error.InvalidIpv4Mapping, net.Address.parseIp6("::123.123.123.123", 0)); + try testing.expectError(error.Incomplete, net.Address.parseIp6("1", 0)); // TODO Make this test pass on other operating systems. if (builtin.os.tag == .linux or comptime builtin.os.tag.isDarwin()) { try testing.expectError(error.Incomplete, net.Address.resolveIp6("ff01::fb%", 0)); -- 2.54.0