Skip to content

Commit ca3a5da

Browse files
alandefreitasclaude
andcommitted
fix(jerryscript): fix memory leak in JS function handle deleter
The custom deleter for wrapped JS functions was not deleting the jerry_value_t handle memory in some edge cases (context cleaned up, wrong thread, etc.). Fixed by ensuring delete h is always called, only skipping jerry_value_free when appropriate. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <[email protected]>
1 parent 66588de commit ca3a5da

File tree

1 file changed

+7
-8
lines changed

1 file changed

+7
-8
lines changed

src/lib/Support/JavaScript.cpp

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2021,15 +2021,14 @@ toDomValue(jerry_value_t v, std::shared_ptr<Context::Impl> const& impl)
20212021
// If Impl is gone or cleanup() was called, the value is already freed.
20222022
if (auto locked = weak_impl.lock())
20232023
{
2024-
if (!locked->alive || !locked->jerry_ctx || locked->cleaning_up)
2025-
return;
2026-
2027-
if (locked->owner_thread != std::this_thread::get_id())
2028-
return; // Different thread: skip to avoid UB
2029-
2030-
auto lock = lockContext(locked);
2031-
jerry_value_free(*h);
2024+
if (locked->alive && locked->jerry_ctx && !locked->cleaning_up
2025+
&& locked->owner_thread == std::this_thread::get_id())
2026+
{
2027+
auto lock = lockContext(locked);
2028+
jerry_value_free(*h);
2029+
}
20322030
}
2031+
// Always delete the handle memory, even if we skipped jerry_value_free
20332032
delete h;
20342033
});
20352034

0 commit comments

Comments
 (0)