From a9eb463202f46f6190f57c3b9a5c4913d6c5d6c5 Mon Sep 17 00:00:00 2001 From: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> Date: Sat, 7 Jan 2023 20:44:03 -0800 Subject: [PATCH] Make `res` nullable in `getaddrinfo` --- lib/std/c.zig | 4 +++- lib/std/net.zig | 14 +++++++------- lib/std/os/windows/ws2_32.zig | 2 +- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/lib/std/c.zig b/lib/std/c.zig index 212b8e2d4d..de3ebe15a8 100644 --- a/lib/std/c.zig +++ b/lib/std/c.zig @@ -322,7 +322,9 @@ pub extern "c" fn getaddrinfo( noalias node: ?[*:0]const u8, noalias service: ?[*:0]const u8, noalias hints: ?*const c.addrinfo, - noalias res: **c.addrinfo, + /// On Linux, `res` will not be modified on error and `freeaddrinfo` will + /// potentially crash if you pass it an undefined pointer + noalias res: *?*c.addrinfo, ) c.EAI; pub extern "c" fn freeaddrinfo(res: *c.addrinfo) void; diff --git a/lib/std/net.zig b/lib/std/net.zig index c4cee40a1d..4a567e0e8f 100644 --- a/lib/std/net.zig +++ b/lib/std/net.zig @@ -764,7 +764,7 @@ pub fn getAddressList(allocator: mem.Allocator, name: []const u8, port: u16) !*A .addrlen = 0, .next = null, }; - var res: *os.addrinfo = undefined; + var res: ?*os.addrinfo = null; var first = true; while (true) { const rc = ws2_32.getaddrinfo(name_c.ptr, port_c.ptr, &hints, &res); @@ -791,7 +791,7 @@ pub fn getAddressList(allocator: mem.Allocator, name: []const u8, port: u16) !*A const addr_count = blk: { var count: usize = 0; - var it: ?*os.addrinfo = res; + var it = res; while (it) |info| : (it = info.next) { if (info.addr != null) { count += 1; @@ -801,7 +801,7 @@ pub fn getAddressList(allocator: mem.Allocator, name: []const u8, port: u16) !*A }; result.addrs = try arena.alloc(Address, addr_count); - var it: ?*os.addrinfo = res; + var it = res; var i: usize = 0; while (it) |info| : (it = info.next) { const addr = info.addr orelse continue; @@ -836,7 +836,7 @@ pub fn getAddressList(allocator: mem.Allocator, name: []const u8, port: u16) !*A .addrlen = 0, .next = null, }; - var res: *os.addrinfo = undefined; + var res: ?*os.addrinfo = null; switch (sys.getaddrinfo(name_c.ptr, port_c.ptr, &hints, &res)) { @intToEnum(sys.EAI, 0) => {}, .ADDRFAMILY => return error.HostLacksNetworkAddresses, @@ -854,11 +854,11 @@ pub fn getAddressList(allocator: mem.Allocator, name: []const u8, port: u16) !*A }, else => unreachable, } - defer sys.freeaddrinfo(res); + defer if (res) |some| sys.freeaddrinfo(some); const addr_count = blk: { var count: usize = 0; - var it: ?*os.addrinfo = res; + var it = res; while (it) |info| : (it = info.next) { if (info.addr != null) { count += 1; @@ -868,7 +868,7 @@ pub fn getAddressList(allocator: mem.Allocator, name: []const u8, port: u16) !*A }; result.addrs = try arena.alloc(Address, addr_count); - var it: ?*os.addrinfo = res; + var it = res; var i: usize = 0; while (it) |info| : (it = info.next) { const addr = info.addr orelse continue; diff --git a/lib/std/os/windows/ws2_32.zig b/lib/std/os/windows/ws2_32.zig index b4d18264f3..ae624dfd2b 100644 --- a/lib/std/os/windows/ws2_32.zig +++ b/lib/std/os/windows/ws2_32.zig @@ -2312,7 +2312,7 @@ pub extern "ws2_32" fn getaddrinfo( pNodeName: ?[*:0]const u8, pServiceName: ?[*:0]const u8, pHints: ?*const addrinfoa, - ppResult: **addrinfoa, + ppResult: *?*addrinfoa, ) callconv(WINAPI) i32; pub extern "ws2_32" fn GetAddrInfoExA(