Skip to content

Memory leak in Literal #3087

@dcodeIO

Description

@dcodeIO

Pinning this here so we don't forget: An exnref Literal's std::unique_ptr<ExceptionPackage> exn (part of the union) is leaky in that it is not destroyed upon copy assignment (if I'm not mistaken).

Steps to reproduce:

  • Compile with -fsanitize=address
  • Run wasm-shell test/spec/exception-handling.wast
==7466==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 256 byte(s) in 4 object(s) allocated from:
    #0 0x7f8563cb4947 in operator new(unsigned long) (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x10f947)
    #1 0x7f8562fa3291 in wasm::Literal::operator=(wasm::Literal const&) (/path/to/binaryen/lbuild/bin/../lib/libbinaryen.so+0x1382291)
    #2 0x56542f4eb7bd in wasm::SmallVector<wasm::Literal, 1ul>::SmallVector(wasm::SmallVector<wasm::Literal, 1ul> const&) (/path/to/binaryen/lbuild/bin/wasm-shell+0x3e7bd)
    #3 0x56542f545ad4 in wasm::OverriddenVisitor<wasm::ModuleInstanceBase<std::map<wasm::Name, wasm::Literals, std::less<wasm::Name>, std::allocator<std::pair<wasm::Name const, wasm::Literals> > >, wasm::ModuleInstance>::RuntimeExpressionRunner, wasm::Flow>::visit(wasm::Expression*) (/path/to/binaryen/lbuild/bin/wasm-shell+0x98ad4)
    #4 0x56542f54a284 in wasm::ExpressionRunner<wasm::ModuleInstanceBase<std::map<wasm::Name, wasm::Literals, std::less<wasm::Name>, std::allocator<std::pair<wasm::Name const, wasm::Literals> > >, wasm::ModuleInstance>::RuntimeExpressionRunner>::visit(wasm::Expression*) (/path/to/binaryen/lbuild/bin/wasm-shell+0x9d284)
    #5 0x56542f5454be in wasm::OverriddenVisitor<wasm::ModuleInstanceBase<std::map<wasm::Name, wasm::Literals, std::less<wasm::Name>, std::allocator<std::pair<wasm::Name const, wasm::Literals> > >, wasm::ModuleInstance>::RuntimeExpressionRunner, wasm::Flow>::visit(wasm::Expression*) (/path/to/binaryen/lbuild/bin/wasm-shell+0x984be)
    #6 0x56542f54a284 in wasm::ExpressionRunner<wasm::ModuleInstanceBase<std::map<wasm::Name, wasm::Literals, std::less<wasm::Name>, std::allocator<std::pair<wasm::Name const, wasm::Literals> > >, wasm::ModuleInstance>::RuntimeExpressionRunner>::visit(wasm::Expression*) (/path/to/binaryen/lbuild/bin/wasm-shell+0x9d284)
    #7 0x56542f5468a6 in wasm::OverriddenVisitor<wasm::ModuleInstanceBase<std::map<wasm::Name, wasm::Literals, std::less<wasm::Name>, std::allocator<std::pair<wasm::Name const, wasm::Literals> > >, wasm::ModuleInstance>::RuntimeExpressionRunner, wasm::Flow>::visit(wasm::Expression*) (/path/to/binaryen/lbuild/bin/wasm-shell+0x998a6)
    #8 0x56542f58410f in wasm::ExpressionRunner<wasm::ModuleInstanceBase<std::map<wasm::Name, wasm::Literals, std::less<wasm::Name>, std::allocator<std::pair<wasm::Name const, wasm::Literals> > >, wasm::ModuleInstance>::RuntimeExpressionRunner>::visitBlock(wasm::Block*) (/path/to/binaryen/lbuild/bin/wasm-shell+0xd710f)
    #9 0x56542f546828 in wasm::OverriddenVisitor<wasm::ModuleInstanceBase<std::map<wasm::Name, wasm::Literals, std::less<wasm::Name>, std::allocator<std::pair<wasm::Name const, wasm::Literals> > >, wasm::ModuleInstance>::RuntimeExpressionRunner, wasm::Flow>::visit(wasm::Expression*) (/path/to/binaryen/lbuild/bin/wasm-shell+0x99828)
    #10 0x56542f58410f in wasm::ExpressionRunner<wasm::ModuleInstanceBase<std::map<wasm::Name, wasm::Literals, std::less<wasm::Name>, std::allocator<std::pair<wasm::Name const, wasm::Literals> > >, wasm::ModuleInstance>::RuntimeExpressionRunner>::visitBlock(wasm::Block*) (/path/to/binaryen/lbuild/bin/wasm-shell+0xd710f)
    #11 0x56542f546828 in wasm::OverriddenVisitor<wasm::ModuleInstanceBase<std::map<wasm::Name, wasm::Literals, std::less<wasm::Name>, std::allocator<std::pair<wasm::Name const, wasm::Literals> > >, wasm::ModuleInstance>::RuntimeExpressionRunner, wasm::Flow>::visit(wasm::Expression*) (/path/to/binaryen/lbuild/bin/wasm-shell+0x99828)
    #12 0x56542f54a284 in wasm::ExpressionRunner<wasm::ModuleInstanceBase<std::map<wasm::Name, wasm::Literals, std::less<wasm::Name>, std::allocator<std::pair<wasm::Name const, wasm::Literals> > >, wasm::ModuleInstance>::RuntimeExpressionRunner>::visit(wasm::Expression*) (/path/to/binaryen/lbuild/bin/wasm-shell+0x9d284)
    #13 0x56542f54a0cb in wasm::OverriddenVisitor<wasm::ModuleInstanceBase<std::map<wasm::Name, wasm::Literals, std::less<wasm::Name>, std::allocator<std::pair<wasm::Name const, wasm::Literals> > >, wasm::ModuleInstance>::RuntimeExpressionRunner, wasm::Flow>::visit(wasm::Expression*) (/path/to/binaryen/lbuild/bin/wasm-shell+0x9d0cb)
    #14 0x56542f54a284 in wasm::ExpressionRunner<wasm::ModuleInstanceBase<std::map<wasm::Name, wasm::Literals, std::less<wasm::Name>, std::allocator<std::pair<wasm::Name const, wasm::Literals> > >, wasm::ModuleInstance>::RuntimeExpressionRunner>::visit(wasm::Expression*) (/path/to/binaryen/lbuild/bin/wasm-shell+0x9d284)
    #15 0x56542f54ac79 in wasm::ModuleInstanceBase<std::map<wasm::Name, wasm::Literals, std::less<wasm::Name>, std::allocator<std::pair<wasm::Name const, wasm::Literals> > >, wasm::ModuleInstance>::callFunctionInternal(wasm::Name, std::vector<wasm::Literal, std::allocator<wasm::Literal> > const&) (/path/to/binaryen/lbuild/bin/wasm-shell+0x9dc79)
    #16 0x56542f4e3cc8 in run_asserts(wasm::Name, unsigned long*, bool*, wasm::Module*, wasm::Element*, wasm::SExpressionWasmBuilder*, wasm::Name) (/path/to/binaryen/lbuild/bin/wasm-shell+0x36cc8)
    #17 0x56542f4ce1b4 in main (/path/to/binaryen/lbuild/bin/wasm-shell+0x211b4)
    #18 0x7f856185a0b2 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x270b2)

Indirect leak of 24 byte(s) in 1 object(s) allocated from:
    #0 0x7f8563cb4947 in operator new(unsigned long) (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x10f947)
    #1 0x7f8562fa3434 in wasm::Literal::operator=(wasm::Literal const&) (/path/to/binaryen/lbuild/bin/../lib/libbinaryen.so+0x1382434)
    #2 0x56542f4eb7bd in wasm::SmallVector<wasm::Literal, 1ul>::SmallVector(wasm::SmallVector<wasm::Literal, 1ul> const&) (/path/to/binaryen/lbuild/bin/wasm-shell+0x3e7bd)
    #3 0x56542f545ad4 in wasm::OverriddenVisitor<wasm::ModuleInstanceBase<std::map<wasm::Name, wasm::Literals, std::less<wasm::Name>, std::allocator<std::pair<wasm::Name const, wasm::Literals> > >, wasm::ModuleInstance>::RuntimeExpressionRunner, wasm::Flow>::visit(wasm::Expression*) (/path/to/binaryen/lbuild/bin/wasm-shell+0x98ad4)
    #4 0x56542f54a284 in wasm::ExpressionRunner<wasm::ModuleInstanceBase<std::map<wasm::Name, wasm::Literals, std::less<wasm::Name>, std::allocator<std::pair<wasm::Name const, wasm::Literals> > >, wasm::ModuleInstance>::RuntimeExpressionRunner>::visit(wasm::Expression*) (/path/to/binaryen/lbuild/bin/wasm-shell+0x9d284)
    #5 0x56542f5454be in wasm::OverriddenVisitor<wasm::ModuleInstanceBase<std::map<wasm::Name, wasm::Literals, std::less<wasm::Name>, std::allocator<std::pair<wasm::Name const, wasm::Literals> > >, wasm::ModuleInstance>::RuntimeExpressionRunner, wasm::Flow>::visit(wasm::Expression*) (/path/to/binaryen/lbuild/bin/wasm-shell+0x984be)
    #6 0x56542f54a284 in wasm::ExpressionRunner<wasm::ModuleInstanceBase<std::map<wasm::Name, wasm::Literals, std::less<wasm::Name>, std::allocator<std::pair<wasm::Name const, wasm::Literals> > >, wasm::ModuleInstance>::RuntimeExpressionRunner>::visit(wasm::Expression*) (/path/to/binaryen/lbuild/bin/wasm-shell+0x9d284)
    #7 0x56542f5468a6 in wasm::OverriddenVisitor<wasm::ModuleInstanceBase<std::map<wasm::Name, wasm::Literals, std::less<wasm::Name>, std::allocator<std::pair<wasm::Name const, wasm::Literals> > >, wasm::ModuleInstance>::RuntimeExpressionRunner, wasm::Flow>::visit(wasm::Expression*) (/path/to/binaryen/lbuild/bin/wasm-shell+0x998a6)
    #8 0x56542f58410f in wasm::ExpressionRunner<wasm::ModuleInstanceBase<std::map<wasm::Name, wasm::Literals, std::less<wasm::Name>, std::allocator<std::pair<wasm::Name const, wasm::Literals> > >, wasm::ModuleInstance>::RuntimeExpressionRunner>::visitBlock(wasm::Block*) (/path/to/binaryen/lbuild/bin/wasm-shell+0xd710f)
    #9 0x56542f546828 in wasm::OverriddenVisitor<wasm::ModuleInstanceBase<std::map<wasm::Name, wasm::Literals, std::less<wasm::Name>, std::allocator<std::pair<wasm::Name const, wasm::Literals> > >, wasm::ModuleInstance>::RuntimeExpressionRunner, wasm::Flow>::visit(wasm::Expression*) (/path/to/binaryen/lbuild/bin/wasm-shell+0x99828)
    #10 0x56542f58410f in wasm::ExpressionRunner<wasm::ModuleInstanceBase<std::map<wasm::Name, wasm::Literals, std::less<wasm::Name>, std::allocator<std::pair<wasm::Name const, wasm::Literals> > >, wasm::ModuleInstance>::RuntimeExpressionRunner>::visitBlock(wasm::Block*) (/path/to/binaryen/lbuild/bin/wasm-shell+0xd710f)
    #11 0x56542f546828 in wasm::OverriddenVisitor<wasm::ModuleInstanceBase<std::map<wasm::Name, wasm::Literals, std::less<wasm::Name>, std::allocator<std::pair<wasm::Name const, wasm::Literals> > >, wasm::ModuleInstance>::RuntimeExpressionRunner, wasm::Flow>::visit(wasm::Expression*) (/path/to/binaryen/lbuild/bin/wasm-shell+0x99828)
    #12 0x56542f54a284 in wasm::ExpressionRunner<wasm::ModuleInstanceBase<std::map<wasm::Name, wasm::Literals, std::less<wasm::Name>, std::allocator<std::pair<wasm::Name const, wasm::Literals> > >, wasm::ModuleInstance>::RuntimeExpressionRunner>::visit(wasm::Expression*) (/path/to/binaryen/lbuild/bin/wasm-shell+0x9d284)
    #13 0x56542f54a0cb in wasm::OverriddenVisitor<wasm::ModuleInstanceBase<std::map<wasm::Name, wasm::Literals, std::less<wasm::Name>, std::allocator<std::pair<wasm::Name const, wasm::Literals> > >, wasm::ModuleInstance>::RuntimeExpressionRunner, wasm::Flow>::visit(wasm::Expression*) (/path/to/binaryen/lbuild/bin/wasm-shell+0x9d0cb)
    #14 0x56542f54a284 in wasm::ExpressionRunner<wasm::ModuleInstanceBase<std::map<wasm::Name, wasm::Literals, std::less<wasm::Name>, std::allocator<std::pair<wasm::Name const, wasm::Literals> > >, wasm::ModuleInstance>::RuntimeExpressionRunner>::visit(wasm::Expression*) (/path/to/binaryen/lbuild/bin/wasm-shell+0x9d284)
    #15 0x56542f54ac79 in wasm::ModuleInstanceBase<std::map<wasm::Name, wasm::Literals, std::less<wasm::Name>, std::allocator<std::pair<wasm::Name const, wasm::Literals> > >, wasm::ModuleInstance>::callFunctionInternal(wasm::Name, std::vector<wasm::Literal, std::allocator<wasm::Literal> > const&) (/path/to/binaryen/lbuild/bin/wasm-shell+0x9dc79)
    #16 0x56542f4e3cc8 in run_asserts(wasm::Name, unsigned long*, bool*, wasm::Module*, wasm::Element*, wasm::SExpressionWasmBuilder*, wasm::Name) (/path/to/binaryen/lbuild/bin/wasm-shell+0x36cc8)
    #17 0x56542f4ce1b4 in main (/path/to/binaryen/lbuild/bin/wasm-shell+0x211b4)
    #18 0x7f856185a0b2 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x270b2)

SUMMARY: AddressSanitizer: 280 byte(s) leaked in 5 allocation(s).

Unfortunately, my attempts to fix this have failed so far, leading to even more obscure use-after-free kind of errors. Requesting expert support :)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions