mirror of
https://github.com/oven-sh/bun
synced 2026-02-16 05:42:43 +00:00
fix(plugin): set virtualModules to nullptr after delete in clearAll (#26940)
## Summary - Fix double-free in `Bun.plugin.clearAll()` by setting `virtualModules = nullptr` after `delete` - In `jsFunctionBunPluginClear` (`BunPlugin.cpp:956`), `delete global->onLoadPlugins.virtualModules` freed the pointer without nullifying it. When the `OnLoad` destructor later runs (during Worker termination or VM destruction), it checks `if (virtualModules)` — the dangling non-null pointer passes the check and is deleted again, corrupting the heap allocator. ## Test plan - [ ] New test `test/regression/issue/plugin-clearall-double-free.test.ts` spawns a subprocess that registers a virtual module, calls `Bun.plugin.clearAll()`, and exits with `BUN_DESTRUCT_VM_ON_EXIT=1` to trigger the destructor path - [ ] Verified the test fails on the system bun (pre-fix) with `pas panic: deallocation did fail ... Alloc bit not set` - [ ] Verified the test passes with the debug build (post-fix) - [ ] Existing plugin tests (`test/js/bun/plugin/plugins.test.ts`) all pass (29/29) 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Bot <claude-bot@bun.sh> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
This commit is contained in:
@@ -954,6 +954,7 @@ BUN_DEFINE_HOST_FUNCTION(jsFunctionBunPluginClear, (JSC::JSGlobalObject * global
|
||||
global->onResolvePlugins.namespaces.clear();
|
||||
|
||||
delete global->onLoadPlugins.virtualModules;
|
||||
global->onLoadPlugins.virtualModules = nullptr;
|
||||
|
||||
return JSC::JSValue::encode(JSC::jsUndefined());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user