Commit a9eb463202
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;