diff --git a/lib/std/Io/Threaded.zig b/lib/std/Io/Threaded.zig index 65ba1fbab0..b9c92433e9 100644 --- a/lib/std/Io/Threaded.zig +++ b/lib/std/Io/Threaded.zig @@ -11846,7 +11846,10 @@ fn netListenUnixWindows( var syscall: AlertableSyscall = try .start(); while (true) { const rc = ws2_32.bind(socket_handle, &storage.any, addr_len); - if (rc != ws2_32.SOCKET_ERROR) break; + if (rc != ws2_32.SOCKET_ERROR) { + syscall.finish(); + break; + } switch (ws2_32.WSAGetLastError()) { .NOTINITIALISED => { syscall.finish(); @@ -11869,15 +11872,18 @@ fn netListenUnixWindows( } } + syscall = try .start(); while (true) { - try syscall.checkCancel(); const rc = ws2_32.listen(socket_handle, options.kernel_backlog); if (rc != ws2_32.SOCKET_ERROR) { syscall.finish(); return socket_handle; } switch (ws2_32.WSAGetLastError()) { - .EINTR, .ECANCELLED, .E_CANCELLED, .OPERATION_ABORTED => continue, + .EINTR, .ECANCELLED, .E_CANCELLED, .OPERATION_ABORTED => { + try syscall.checkCancel(); + continue; + }, .NOTINITIALISED => { syscall.finish(); try initializeWsa(t); @@ -12160,9 +12166,12 @@ fn setSocketOption(fd: posix.fd_t, level: i32, opt_name: u32, option: u32) !void fn setSocketOptionWsa(t: *Threaded, socket: Io.net.Socket.Handle, level: i32, opt_name: u32, option: u32) !void { const o: []const u8 = @ptrCast(&option); var syscall: AlertableSyscall = try .start(); - const rc = ws2_32.setsockopt(socket, level, @bitCast(opt_name), o.ptr, @intCast(o.len)); while (true) { - if (rc != ws2_32.SOCKET_ERROR) return syscall.finish(); + const rc = ws2_32.setsockopt(socket, level, @bitCast(opt_name), o.ptr, @intCast(o.len)); + if (rc != ws2_32.SOCKET_ERROR) { + syscall.finish(); + return; + } switch (ws2_32.WSAGetLastError()) { .EINTR, .ECANCELLED, .E_CANCELLED, .OPERATION_ABORTED => { try syscall.checkCancel(); @@ -12175,7 +12184,9 @@ fn setSocketOptionWsa(t: *Threaded, socket: Io.net.Socket.Handle, level: i32, op continue; }, .ENETDOWN => return syscall.fail(error.NetworkDown), - .EFAULT, .ENOTSOCK, .EINVAL => |err| return syscall.wsaErrorBug(err), + .EFAULT => |err| return syscall.wsaErrorBug(err), + .ENOTSOCK => |err| return syscall.wsaErrorBug(err), + .EINVAL => |err| return syscall.wsaErrorBug(err), else => |err| return syscall.unexpectedWsaError(err), } } @@ -12313,7 +12324,10 @@ fn netConnectUnixWindows( var syscall: AlertableSyscall = try .start(); while (true) { const rc = ws2_32.connect(socket_handle, &storage.any, addr_len); - if (rc != ws2_32.SOCKET_ERROR) break; + if (rc != ws2_32.SOCKET_ERROR) { + syscall.finish(); + break; + } switch (ws2_32.WSAGetLastError()) { .EINTR, .ECANCELLED, .E_CANCELLED, .OPERATION_ABORTED => { try syscall.checkCancel(); @@ -12326,14 +12340,14 @@ fn netConnectUnixWindows( continue; }, .ECONNREFUSED => return syscall.fail(error.FileNotFound), - .EFAULT => |err| return syscall.wsaErrorBug(err), - .EINVAL => |err| return syscall.wsaErrorBug(err), - .EISCONN => |err| return syscall.wsaErrorBug(err), - .ENOTSOCK => |err| return syscall.wsaErrorBug(err), .EWOULDBLOCK => return syscall.fail(error.WouldBlock), .EACCES => return syscall.fail(error.AccessDenied), .ENOBUFS => return syscall.fail(error.SystemResources), .EAFNOSUPPORT => return syscall.fail(error.AddressFamilyUnsupported), + .EFAULT => |err| return syscall.wsaErrorBug(err), + .EINVAL => |err| return syscall.wsaErrorBug(err), + .EISCONN => |err| return syscall.wsaErrorBug(err), + .ENOTSOCK => |err| return syscall.wsaErrorBug(err), else => |err| return syscall.unexpectedWsaError(err), } }