authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-09-22 17:32:38-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-10-02 16:30:59-07:00
log3e828b02bdcb0d63c47a3f1bbe7333af85a5b9a3
treeeda97c320aa38b39f076ee3b5827439f0d7e137e
parent0806252a9ba7e3bd1d3e9ed3af3d4579b1e675d9

std.net: fix parsing IPv6 addr "::"


1 files changed, 17 insertions(+), 6 deletions(-)

lib/std/Io/net.zig+17-6
......@@ -276,9 +276,9 @@ pub const Ip6Address = struct {
276276 if (text[text_i] != ':') return .{ .invalid_byte = text_i };
277277 assert(parts_i == 0);
278278 }
279 text_i += 1;
280 if (text.len - text_i == 0) return .unexpected_end;
281279 compress_start = parts_i;
280 text_i += 1;
281 if (text.len - text_i == 0) continue :state .end;
282282 continue :c text[text_i];
283283 } else {
284284 parts_i += 1;
......@@ -744,19 +744,30 @@ pub const Server = struct {
744744test "parsing IPv6 addresses" {
745745 try testIp6Parse("fe80::e0e:76ff:fed4:cf22%eno1");
746746 try testIp6Parse("2001:db8::1");
747 try testIp6ParseTransform("2001:db8::1", "2001:0db8:0000:0000:0000:0000:0000:0001");
748 try testIp6Parse("::1");
749 try testIp6Parse("::");
750 try testIp6Parse("fe80::1");
751 try testIp6Parse("fe80::abcd:ef12%3");
752 try testIp6Parse("ff02::");
753 try testIp6Parse("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff");
754}
755
756fn testIp6Parse(input: []const u8) !void {
757 return testIp6ParseTransform(input, input);
747758}
748759
749fn testIp6Parse(text: []const u8) !void {
750 const ua = switch (Ip6Address.Unresolved.parse(text)) {
760fn testIp6ParseTransform(expected: []const u8, input: []const u8) !void {
761 const ua = switch (Ip6Address.Unresolved.parse(input)) {
751762 .success => |p| p,
752763 else => |x| {
753 std.debug.print("failed to parse \"{s}\": {any}\n", .{ text, x });
764 std.debug.print("failed to parse \"{s}\": {any}\n", .{ input, x });
754765 return error.TestFailed;
755766 },
756767 };
757768 var buffer: [100]u8 = undefined;
758769 const result = try std.fmt.bufPrint(&buffer, "{f}", .{ua});
759 try std.testing.expectEqualStrings(text, result);
770 try std.testing.expectEqualStrings(expected, result);
760771}
761772
762773test {