Claude Bot 4befa83175 Fix SNI reload() crashes by preventing premature UserRoute cleanup
Fixes #21792 - servers with SNI (multiple TLS certificates) would crash when
calling server.reload(), even with concurrent requests.

## Root Cause Analysis (using gdb)

The crash occurred because UserRoute structures were being freed while in-flight
HTTP handlers still had pointers to them. Stack trace analysis revealed:

1. Request arrives, uWS gets pointer to UserRoute from routing table
2. Handler extracts server pointer: `server = user_route.server`
3. reload() is called concurrently
4. reload() called setRoutes() which freed old UserRoute ArrayList
5. Handler tries to access freed UserRoute → **Segmentation fault**

The `this` pointer was garbage (0x919b6d48ca4c8b0d) because the UserRoute
structure containing it had been freed.

## The Fix

**Two-part solution:**

1. **Clear SNI domain routes properly** - Added `uws_app_clear_sni_routes()`
   helper that switches to each SNI domain and clears routes, preventing stale
   handlers from being invoked.

2. **Defer UserRoute cleanup** - Modified `setRoutesInternal()` to optionally
   skip freeing old UserRoutes during reload. Old routes remain in memory until
   server deinit, ensuring in-flight handlers can safely access them.

## Implementation Details

- `libuwsockets.cpp`: New `uws_app_clear_sni_routes()` function
- `App.zig`: Wrapper method `clearSNIRoutes()`
- `server.zig`:
  - `clearSNIRoutesHelper()` collects SNI names and calls uWS helper
  - `setRoutesInternal(should_free)` parameter controls cleanup
  - `onReloadFromZig()` uses non-freeing path for routes
  - Called in `stopListening()`, `onReloadFromZig()`, and `deinit()`

## Testing

 **All scenarios now work:**
- Simple reload() between requests
- **reload() with concurrent active requests** (the hard case!)
- User's complex Elysia-like reproduction with rapid switching
- SNI with multiple domains

 **Verified:**
- System bun (v1.3.1): Crashes with segfault
- Our fix: Completes successfully, all responses correct

## Memory Management

Old UserRoutes accumulate during reload() but are cleaned up on server deinit.
This is acceptable as:
- reload() is not called frequently
- Memory is bounded by number of routes × reloads
- All cleaned up when server stops

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-22 23:50:36 +00:00
2025-10-07 20:08:57 -07:00
2025-10-21 16:25:29 -07:00
2024-12-26 11:48:30 -08:00
2024-12-12 03:21:56 -08:00
2025-10-05 04:28:25 -07:00
2025-01-07 20:19:12 -08:00
2025-10-19 18:45:54 -07:00
2025-10-22 12:13:14 -07:00
2024-07-24 01:30:31 -07:00
2025-10-22 12:13:14 -07:00
2025-07-10 00:10:43 -07:00
2025-07-10 00:10:43 -07:00

Logo

Bun

stars Bun speed

Documentation   •   Discord   •   Issues   •   Roadmap

Read the docs →

What is Bun?

Bun is an all-in-one toolkit for JavaScript and TypeScript apps. It ships as a single executable called bun.

At its core is the Bun runtime, a fast JavaScript runtime designed as a drop-in replacement for Node.js. It's written in Zig and powered by JavaScriptCore under the hood, dramatically reducing startup times and memory usage.

bun run index.tsx             # TS and JSX supported out-of-the-box

The bun command-line tool also implements a test runner, script runner, and Node.js-compatible package manager. Instead of 1,000 node_modules for development, you only need bun. Bun's built-in tools are significantly faster than existing options and usable in existing Node.js projects with little to no changes.

bun test                      # run tests
bun run start                 # run the `start` script in `package.json`
bun install <pkg>             # install a package
bunx cowsay 'Hello, world!'   # execute a package

Install

Bun supports Linux (x64 & arm64), macOS (x64 & Apple Silicon) and Windows (x64).

Linux users — Kernel version 5.6 or higher is strongly recommended, but the minimum is 5.1.

x64 users — if you see "illegal instruction" or similar errors, check our CPU requirements

# with install script (recommended)
curl -fsSL https://bun.com/install | bash

# on windows
powershell -c "irm bun.com/install.ps1 | iex"

# with npm
npm install -g bun

# with Homebrew
brew tap oven-sh/bun
brew install bun

# with Docker
docker pull oven/bun
docker run --rm --init --ulimit memlock=-1:-1 oven/bun

Upgrade

To upgrade to the latest version of Bun, run:

bun upgrade

Bun automatically releases a canary build on every commit to main. To upgrade to the latest canary build, run:

bun upgrade --canary

View canary build

Guides

Contributing

Refer to the Project > Contributing guide to start contributing to Bun.

License

Refer to the Project > License page for information about Bun's licensing.

Description
Bun is a fast, incrementally adoptable all-in-one JavaScript, TypeScript & JSX toolkit. Use individual tools like bun test or bun install in Node.js projects, or adopt the complete stack with a fast JavaScript runtime, bundler, test runner, and package manager built in. Bun aims for 100% Node.js compatibility.
Readme 849 MiB
Languages
Zig 60.6%
C++ 24.8%
TypeScript 8.3%
C 3.3%
JavaScript 1.4%
Other 1.1%