Commit a9eb463202

Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
2023-01-08 05:44:03
Make `res` nullable in `getaddrinfo`
1 parent 6c98c8d
Changed files (3)
lib
std
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(
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;
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;