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 {...@@ -276,9 +276,9 @@ pub const Ip6Address = struct {
276 if (text[text_i] != ':') return .{ .invalid_byte = text_i };276 if (text[text_i] != ':') return .{ .invalid_byte = text_i };
277 assert(parts_i == 0);277 assert(parts_i == 0);
278 }278 }
279 text_i += 1;
280 if (text.len - text_i == 0) return .unexpected_end;
281 compress_start = parts_i;279 compress_start = parts_i;
280 text_i += 1;
281 if (text.len - text_i == 0) continue :state .end;
282 continue :c text[text_i];282 continue :c text[text_i];
283 } else {283 } else {
284 parts_i += 1;284 parts_i += 1;
...@@ -744,19 +744,30 @@ pub const Server = struct {...@@ -744,19 +744,30 @@ pub const Server = struct {
744test "parsing IPv6 addresses" {744test "parsing IPv6 addresses" {
745 try testIp6Parse("fe80::e0e:76ff:fed4:cf22%eno1");745 try testIp6Parse("fe80::e0e:76ff:fed4:cf22%eno1");
746 try testIp6Parse("2001:db8::1");746 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);
747}758}
748759
749fn testIp6Parse(text: []const u8) !void {760fn testIp6ParseTransform(expected: []const u8, input: []const u8) !void {
750 const ua = switch (Ip6Address.Unresolved.parse(text)) {761 const ua = switch (Ip6Address.Unresolved.parse(input)) {
751 .success => |p| p,762 .success => |p| p,
752 else => |x| {763 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 });
754 return error.TestFailed;765 return error.TestFailed;
755 },766 },
756 };767 };
757 var buffer: [100]u8 = undefined;768 var buffer: [100]u8 = undefined;
758 const result = try std.fmt.bufPrint(&buffer, "{f}", .{ua});769 const result = try std.fmt.bufPrint(&buffer, "{f}", .{ua});
759 try std.testing.expectEqualStrings(text, result);770 try std.testing.expectEqualStrings(expected, result);
760}771}
761772
762test {773test {