From 57010cc44883a5434276cee956bc84a0485d2f32 Mon Sep 17 00:00:00 2001 From: Jarred Sumner Date: Sun, 24 Sep 2023 03:17:19 -0700 Subject: [PATCH] Avoid using std.net.Address.parse (#5950) Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> --- src/deps/c_ares.zig | 2 +- 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 3c86b0327b366..14fcb79e89fc3 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 03ba35e66fdc3..8ecadad83ceb0 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(