diff --git a/lib/std/Io/net/HostName.zig b/lib/std/Io/net/HostName.zig index 26c5fc855f66a0abf270954f8947690334b5a0d7..262a86386b60f9b3b4585e7749089c02eca47efc 100644 --- a/lib/std/Io/net/HostName.zig +++ b/lib/std/Io/net/HostName.zig @@ -28,11 +28,11 @@ pub const ValidateError = error{ pub fn validate(bytes: []const u8) ValidateError!void { if (bytes.len == 0) return error.InvalidHostName; - // Ignore trailing dot (FQDN). It doesn't count toward our length. - const end = if (bytes[bytes.len - 1] == '.') bytes.len - 1 else bytes.len; - // The accepted maximum length of a hostname, including labels and dots. - if (end > max_len) return error.NameTooLong; + if (bytes.len > max_len) return error.NameTooLong; + + // Ignore trailing dot (FQDN). + const end = if (bytes[bytes.len - 1] == '.') bytes.len - 1 else bytes.len; // Hostnames are divided into dot-separated "labels", which: // @@ -83,7 +83,6 @@ test validate { const many_a_dot_buf: [127][2]u8 = @splat(.{ 'a', '.' }); const many_a_dot: []const u8 = @ptrCast(&many_a_dot_buf); try validate(many_a_dot ++ "a"); // Total length 255 (valid) - try validate(many_a_dot ++ "a."); // Total length 255 + trailing dot (valid) // Invalid hostnames try std.testing.expectError(error.InvalidHostName, validate("")); @@ -98,8 +97,8 @@ test validate { try std.testing.expectError(error.InvalidHostName, validate(".")); try std.testing.expectError(error.InvalidHostName, validate("..")); try std.testing.expectError(error.InvalidHostName, validate(&many_a ++ "a.com")); // Label length 64 (too long) + try std.testing.expectError(error.NameTooLong, validate(many_a_dot ++ "a.")); // Total length 255 + trailing dot (too long) try std.testing.expectError(error.NameTooLong, validate(many_a_dot ++ "ab")); // Total length 256 (too long) - try std.testing.expectError(error.NameTooLong, validate(many_a_dot ++ "ab.")); // Total length 256 + trailing dot (too long) } pub fn init(bytes: []const u8) ValidateError!HostName {