This is an archive of the discontinued LLVM Phabricator instance.

[WebAssembly] Fix leak in Emscripten SjLj
ClosedPublic

Authored by aheejin on Aug 10 2021, 11:50 AM.

Details

Summary

For SjLj, we allocate a table to record setjmp buffer info in the entry
of each setjmp-calling function by inserting a malloc call, and
insert a free call to free the buffer before each ret instruction.

But this is not sufficient; we have to free the buffer before we throw.
In SjLj handling, normal functions that can possibly throw or longjmp
are wrapped with an invoke and caught within the function so they don't
end up escaping the function. But three functions throw and escape the
function:

  • __resumeException (Emscripten library function used for Emscripten EH)
  • emscripten_longjmp (Emscripten library function used for Emscripten SjLj)
  • __cxa_throw (libc++abi function called when for C++ throw keyword)

The first two functions are used to rethrow the current
exception/longjmp when the caught exception/longjmp is not for the
current function. __cxa_throw is used for exception, and because we
consider that a function that cannot longjmp, it escapes the function
right away, before which we should free the buffer.

Currently lsan.test_longjmp3 and lsan.test_exceptions_longjmp3 fail
in Emscripten; this CL fixes these.

Diff Detail