src: fix use-after-free in CleanupHookThunkRun · nodejs/node@f66ed89 · GitHub
Skip to content

Commit f66ed89

Browse files
everett1992sreehariannam
authored andcommitted
src: fix use-after-free in CleanupHookThunkRun
CleanupHookThunkRun() read thunk->isolate/fun/arg from the CleanupHookThunk after invoking thunk->fun(). For every node::ObjectWrap alive at teardown, thunk->fun is ObjectWrap::CleanupHook, which deletes the wrap; ~ObjectWrap() calls RemoveEnvironmentCleanupHook() itself, erasing the CleanupHookThunk from the registry and freeing the node it lives in. The subsequent read of thunk->isolate/fun/arg to make the (now redundant) second RemoveEnvironmentCleanupHook() call was therefore a use-after-free. Cache the fields before running the hook so nothing is read from `thunk` once it may have been freed. Taken over from #65196, which has been inactive; the original change is unmodified apart from the added comment. This also unblocks #65042, the backport of the cleanup hook registry to v24.x. Without that registry ~ObjectWrap() asserts during garbage collection, so every 24.x runtime aborts for ObjectWrap addons (#65446), as do 26.x runtimes before 26.4.0 when used with newer headers (#65262). Fixes: #65195 Refs: #65196 Refs: #65042 Refs: #65446 Refs: #65262 Assisted-by: a closed-source coding agent Co-authored-by: Sreehari Annam <sreehari.annam@gmail.com> Signed-off-by: Caleb Everett <everett.caleb@gmail.com> PR-URL: #65630 Reviewed-By: Trivikram Kamat <trivikr.dev@gmail.com> Reviewed-By: Shelley Vohr <shelley.vohr@gmail.com>
1 parent d0535b1 commit f66ed89

2 files changed

Lines changed: 49 additions & 2 deletions

File tree

‎src/api/hooks.cc‎

Lines changed: 9 additions & 2 deletions

‎test/cctest/test_environment.cc‎

Lines changed: 40 additions & 0 deletions

0 commit comments

Comments
 (0)