diff options
-rw-r--r-- | src/deps/c_ares.zig | 2 | ||||
-rw-r--r-- | src/string_immutable.zig | 36 |
2 files changed, 19 insertions, 19 deletions
diff --git a/src/deps/c_ares.zig b/src/deps/c_ares.zig index 3c86b0327..14fcb79e8 100644 --- a/src/deps/c_ares.zig +++ b/src/deps/c_ares.zig @@ -1252,7 +1252,7 @@ pub extern fn ares_set_servers_csv(channel: *Channel, servers: [*c]const u8) c_i pub extern fn ares_set_servers_ports_csv(channel: *Channel, servers: [*c]const u8) c_int; pub extern fn ares_get_servers(channel: *Channel, servers: *?*struct_ares_addr_port_node) c_int; pub extern fn ares_get_servers_ports(channel: *Channel, servers: *?*struct_ares_addr_port_node) c_int; -pub extern fn ares_inet_ntop(af: c_int, src: ?*const anyopaque, dst: [*c]u8, size: ares_socklen_t) [*c]const u8; +pub extern fn ares_inet_ntop(af: c_int, src: ?*const anyopaque, dst: [*c]u8, size: ares_socklen_t) ?[*:0]const u8; pub extern fn ares_inet_pton(af: c_int, src: [*c]const u8, dst: ?*anyopaque) c_int; pub const ARES_SUCCESS = 0; pub const ARES_ENODATA = 1; diff --git a/src/string_immutable.zig b/src/string_immutable.zig index 03ba35e66..8ecadad83 100644 --- a/src/string_immutable.zig +++ b/src/string_immutable.zig @@ -4676,30 +4676,30 @@ test "eqlCaseInsensitiveASCII" { } pub fn isIPAddress(input: []const u8) bool { - if (containsChar(input, ':')) - return true; + var max_ip_address_buffer: [512]u8 = undefined; + if (input.len > max_ip_address_buffer.len) return false; - if (comptime Environment.isWindows) { - return bun.todo(@src(), false); - } + var sockaddr: std.os.sockaddr = undefined; + @memset(std.mem.asBytes(&sockaddr), 0); + @memcpy(max_ip_address_buffer[0..input.len], input); + max_ip_address_buffer[input.len] = 0; - if (std.net.Address.resolveIp(input, 0)) |_| { - return true; - } else |_| { - return false; - } + var ip_addr_str: [:0]const u8 = max_ip_address_buffer[0.. :0]; + + return bun.c_ares.ares_inet_pton(std.os.AF.INET, ip_addr_str.ptr, &sockaddr) != 0 or bun.c_ares.ares_inet_pton(std.os.AF.INET6, ip_addr_str.ptr, &sockaddr) != 0; } pub fn isIPV6Address(input: []const u8) bool { - if (comptime Environment.isWindows) { - return bun.todo(@src(), false); - } + var max_ip_address_buffer: [512]u8 = undefined; + if (input.len > max_ip_address_buffer.len) return false; - if (std.net.Address.parseIp6(input, 0)) |_| { - return true; - } else |_| { - return false; - } + var sockaddr: std.os.sockaddr = undefined; + @memset(std.mem.asBytes(&sockaddr), 0); + @memcpy(max_ip_address_buffer[0..input.len], input); + max_ip_address_buffer[input.len] = 0; + + var ip_addr_str: [:0]const u8 = max_ip_address_buffer[0.. :0]; + return bun.c_ares.ares_inet_pton(std.os.AF.INET6, ip_addr_str.ptr, &sockaddr) != 0; } pub fn cloneNormalizingSeparators( |