From 6bb30679accddca06de5d00b6c6cc3266a566621 Mon Sep 17 00:00:00 2001 From: notcancername Date: Fri, 7 Nov 2025 01:14:29 +0100 Subject: [PATCH 1/2] std.Io.HostName: fix a bug where `expand` would include the terminator to the zero terminator was included in the output of `HostName.expand`, which would try and fail to `HostName.validate` it because it contained a zero byte closes #25811 --- lib/std/Io/net/HostName.zig | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/std/Io/net/HostName.zig b/lib/std/Io/net/HostName.zig index 35aeff6942fe..e40b57a2a276 100644 --- a/lib/std/Io/net/HostName.zig +++ b/lib/std/Io/net/HostName.zig @@ -137,7 +137,6 @@ pub fn expand(noalias packet: []const u8, start_i: usize, noalias dest_buffer: [ i += 1 + label_len; } else { dest[dest_i] = 0; - dest_i += 1; return .{ len orelse i - start_i + 1, try .init(dest[0..dest_i]), From 8119b14c9621a008448560cb1200ad5eaf67139d Mon Sep 17 00:00:00 2001 From: notcancername Date: Fri, 7 Nov 2025 01:58:49 +0100 Subject: [PATCH 2/2] std.Io.HostName: add regression test for #25811 --- lib/std/Io/net/HostName.zig | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/lib/std/Io/net/HostName.zig b/lib/std/Io/net/HostName.zig index e40b57a2a276..f04caf67d7a2 100644 --- a/lib/std/Io/net/HostName.zig +++ b/lib/std/Io/net/HostName.zig @@ -146,6 +146,18 @@ pub fn expand(noalias packet: []const u8, start_i: usize, noalias dest_buffer: [ return error.InvalidDnsPacket; } +// regression test for +test "HostName.expand correctly parses host names in DNS packets" { + const packet = "\x90A\x81\x80\x00\x01\x00\x03\x00\x00\x00\x00\x03www\x15alditalk-kundenportal\x02de\x00\x00\x01\x00\x01\xc0\x0c\x00\x05\x00\x01\x00\x00\x076\x00\x1f\x06static\x08spectrum\x0atelefonica\x02de\x00\xc0:\x00\x01\x00\x01\x00\x00\x00I\x00\x04\x8deZ'\xc0:\x00\x01\x00\x01\x00\x00\x00I\x00\x04\x8deZ&"; + const index = 58; + + var out: [max_len]u8 = undefined; + const bytes_consumed, const name = try expand(packet, index, &out); + + try std.testing.expectEqual(@as(usize, 31), bytes_consumed); + try std.testing.expectEqualSlices(u8, "static.spectrum.telefonica.de", name.bytes); +} + pub const DnsRecord = enum(u8) { A = 1, CNAME = 5,