diff options
Diffstat (limited to 'src/bun.js/api/server.zig')
-rw-r--r-- | src/bun.js/api/server.zig | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/src/bun.js/api/server.zig b/src/bun.js/api/server.zig index 0cb5d4cd1..0adaf8b3b 100644 --- a/src/bun.js/api/server.zig +++ b/src/bun.js/api/server.zig @@ -3644,13 +3644,11 @@ pub fn NewServer(comptime ssl_enabled_: bool, comptime debug_mode_: bool) type { if (upgrader.aborted) { return JSC.jsBoolean(false); } - request.upgrader = null; + if (upgrader.upgrade_context == null or @ptrToInt(upgrader.upgrade_context) == std.math.maxInt(usize)) { return JSC.jsBoolean(false); } var ctx = upgrader.upgrade_context.?; - // obviously invalid pointer marks it as used - upgrader.upgrade_context = @intToPtr(*uws.uws_socket_context_s, std.math.maxInt(usize)); var sec_websocket_key_str = ZigString.Empty; @@ -3736,6 +3734,13 @@ pub fn NewServer(comptime ssl_enabled_: bool, comptime debug_mode_: bool) type { } } + // --- After this point, do not throw an exception + // See https://github.com/oven-sh/bun/issues/1339 + + // obviously invalid pointer marks it as used + upgrader.upgrade_context = @intToPtr(*uws.uws_socket_context_s, std.math.maxInt(usize)); + request.upgrader = null; + upgrader.resp.clearAborted(); var ws = this.vm.allocator.create(ServerWebSocket) catch return .zero; ws.* = .{ |