Samsung / escargot

Escargot is a lightweight JavaScript engine designed specifically for resource-constrained environments.
GNU Lesser General Public License v2.1
268 stars 43 forks source link

SEGV Escargot::TightVector<Escargot::ASTBlockContextNameInfo, GCUtil::gc_malloc_atomic_allocator<Escargot::ASTBlockContextNameInfo> >::size() const #1380

Closed 7331akasokoan closed 1 month ago

7331akasokoan commented 2 months ago

commit: d398f1ece3bae25c00465aea7f00b548d1131241

build setting:

cmake -DCMAKE_CXX_FLAGS=-fsanitize=address -DESCARGOT_MODE=debug -DESCARGOT_OUTPUT=shell -GNinja

poc.js:

function v3( v0 = 1
(function v6() {
for (let [a = v0] of [[]]) {
}
})();

ASAN report:

AddressSanitizer:DEADLYSIGNAL
=================================================================
==49069==ERROR: AddressSanitizer: SEGV on unknown address 0x000000000010 (pc 0x55f0902c759f bp 0x7ffc97a0ce20 sp 0x7ffc97a0ce10 T0)
==49069==The signal is caused by a READ memory access.
==49069==Hint: address points to the zero page.
    #0 0x55f0902c759f in Escargot::TightVector<Escargot::ASTBlockContextNameInfo, GCUtil::gc_malloc_atomic_allocator<Escargot::ASTBlockContextNameInfo> >::size() const /home/fuzzer/escargot/src/util/TightVector.h:185
    #1 0x55f09039fc6f in Escargot::esprima::Parser::closeBlock(Escargot::esprima::Parser::ParserBlockContext&) /home/fuzzer/escargot/src/parser/esprima_cpp/esprima.cpp:3705
    #2 0x55f0904711c1 in Escargot::SyntaxChecker::ASTNode Escargot::esprima::Parser::parseFunctionExpression<Escargot::SyntaxChecker>(Escargot::SyntaxChecker&) /home/fuzzer/escargot/src/parser/esprima_cpp/esprima.cpp:5463
    #3 0x55f090441310 in Escargot::SyntaxChecker::ASTNode Escargot::esprima::Parser::parsePrimaryExpression<Escargot::SyntaxChecker>(Escargot::SyntaxChecker&) /home/fuzzer/escargot/src/parser/esprima_cpp/esprima.cpp:1212
    #4 0x55f09046e88b in Escargot::SyntaxChecker::ASTNode Escargot::esprima::Parser::inheritCoverGrammar<Escargot::SyntaxChecker, Escargot::SyntaxNode (Escargot::esprima::Parser::*)(Escargot::SyntaxChecker&)>(Escargot::SyntaxChecker&, Escargot::SyntaxNode (Escargot::esprima::Parser::*)(Escargot::SyntaxChecker&)) /home/fuzzer/escargot/src/parser/esprima_cpp/esprima.cpp:1008
    #5 0x55f0904b9cc8 in Escargot::SyntaxChecker::ASTNode Escargot::esprima::Parser::parseLeftHandSideExpressionAllowCall<Escargot::SyntaxChecker>(Escargot::SyntaxChecker&) /home/fuzzer/escargot/src/parser/esprima_cpp/esprima.cpp:2477
    #6 0x55f09046e88b in Escargot::SyntaxChecker::ASTNode Escargot::esprima::Parser::inheritCoverGrammar<Escargot::SyntaxChecker, Escargot::SyntaxNode (Escargot::esprima::Parser::*)(Escargot::SyntaxChecker&)>(Escargot::SyntaxChecker&, Escargot::SyntaxNode (Escargot::esprima::Parser::*)(Escargot::SyntaxChecker&)) /home/fuzzer/escargot/src/parser/esprima_cpp/esprima.cpp:1008
    #7 0x55f0904e6a84 in Escargot::SyntaxChecker::ASTNode Escargot::esprima::Parser::parseUpdateExpression<Escargot::SyntaxChecker>(Escargot::SyntaxChecker&) /home/fuzzer/escargot/src/parser/esprima_cpp/esprima.cpp:2767
    #8 0x55f0904caf85 in Escargot::SyntaxChecker::ASTNode Escargot::esprima::Parser::parseUnaryExpression<Escargot::SyntaxChecker>(Escargot::SyntaxChecker&) /home/fuzzer/escargot/src/parser/esprima_cpp/esprima.cpp:2907
    #9 0x55f09046e88b in Escargot::SyntaxChecker::ASTNode Escargot::esprima::Parser::inheritCoverGrammar<Escargot::SyntaxChecker, Escargot::SyntaxNode (Escargot::esprima::Parser::*)(Escargot::SyntaxChecker&)>(Escargot::SyntaxChecker&, Escargot::SyntaxNode (Escargot::esprima::Parser::*)(Escargot::SyntaxChecker&)) /home/fuzzer/escargot/src/parser/esprima_cpp/esprima.cpp:1008
    #10 0x55f0904ab0c6 in Escargot::SyntaxChecker::ASTNode Escargot::esprima::Parser::parseExponentiationExpression<Escargot::SyntaxChecker>(Escargot::SyntaxChecker&) /home/fuzzer/escargot/src/parser/esprima_cpp/esprima.cpp:2915
    #11 0x55f09046e88b in Escargot::SyntaxChecker::ASTNode Escargot::esprima::Parser::inheritCoverGrammar<Escargot::SyntaxChecker, Escargot::SyntaxNode (Escargot::esprima::Parser::*)(Escargot::SyntaxChecker&)>(Escargot::SyntaxChecker&, Escargot::SyntaxNode (Escargot::esprima::Parser::*)(Escargot::SyntaxChecker&)) /home/fuzzer/escargot/src/parser/esprima_cpp/esprima.cpp:1008
    #12 0x55f09046d154 in Escargot::SyntaxChecker::ASTNode Escargot::esprima::Parser::parseBinaryExpression<Escargot::SyntaxChecker>(Escargot::SyntaxChecker&) /home/fuzzer/escargot/src/parser/esprima_cpp/esprima.cpp:3013
    #13 0x55f09046e88b in Escargot::SyntaxChecker::ASTNode Escargot::esprima::Parser::inheritCoverGrammar<Escargot::SyntaxChecker, Escargot::SyntaxNode (Escargot::esprima::Parser::*)(Escargot::SyntaxChecker&)>(Escargot::SyntaxChecker&, Escargot::SyntaxNode (Escargot::esprima::Parser::*)(Escargot::SyntaxChecker&)) /home/fuzzer/escargot/src/parser/esprima_cpp/esprima.cpp:1008
    #14 0x55f09043f29b in Escargot::SyntaxChecker::ASTNode Escargot::esprima::Parser::parseConditionalExpression<Escargot::SyntaxChecker>(Escargot::SyntaxChecker&) /home/fuzzer/escargot/src/parser/esprima_cpp/esprima.cpp:3164
    #15 0x55f0904094d0 in Escargot::SyntaxChecker::ASTNode Escargot::esprima::Parser::parseAssignmentExpression<Escargot::SyntaxChecker, false>(Escargot::SyntaxChecker&) /home/fuzzer/escargot/src/parser/esprima_cpp/esprima.cpp:3206
    #16 0x55f09040e2c1 in Escargot::SyntaxChecker::ASTNode Escargot::esprima::Parser::isolateCoverGrammar<Escargot::SyntaxChecker, Escargot::SyntaxNode (Escargot::esprima::Parser::*)(Escargot::SyntaxChecker&)>(Escargot::SyntaxChecker&, Escargot::SyntaxNode (Escargot::esprima::Parser::*)(Escargot::SyntaxChecker&)) /home/fuzzer/escargot/src/parser/esprima_cpp/esprima.cpp:984
    #17 0x55f0904d939c in Escargot::SyntaxChecker::ASTNodeList Escargot::esprima::Parser::parseArguments<Escargot::SyntaxChecker>(Escargot::SyntaxChecker&) /home/fuzzer/escargot/src/parser/esprima_cpp/esprima.cpp:2282
    #18 0x55f0904ba280 in Escargot::SyntaxChecker::ASTNode Escargot::esprima::Parser::parseLeftHandSideExpressionAllowCall<Escargot::SyntaxChecker>(Escargot::SyntaxChecker&) /home/fuzzer/escargot/src/parser/esprima_cpp/esprima.cpp:2493
    #19 0x55f09046e88b in Escargot::SyntaxChecker::ASTNode Escargot::esprima::Parser::inheritCoverGrammar<Escargot::SyntaxChecker, Escargot::SyntaxNode (Escargot::esprima::Parser::*)(Escargot::SyntaxChecker&)>(Escargot::SyntaxChecker&, Escargot::SyntaxNode (Escargot::esprima::Parser::*)(Escargot::SyntaxChecker&)) /home/fuzzer/escargot/src/parser/esprima_cpp/esprima.cpp:1008
    #20 0x55f0904e6a84 in Escargot::SyntaxChecker::ASTNode Escargot::esprima::Parser::parseUpdateExpression<Escargot::SyntaxChecker>(Escargot::SyntaxChecker&) /home/fuzzer/escargot/src/parser/esprima_cpp/esprima.cpp:2767
    #21 0x55f0904caf85 in Escargot::SyntaxChecker::ASTNode Escargot::esprima::Parser::parseUnaryExpression<Escargot::SyntaxChecker>(Escargot::SyntaxChecker&) /home/fuzzer/escargot/src/parser/esprima_cpp/esprima.cpp:2907
    #22 0x55f09046e88b in Escargot::SyntaxChecker::ASTNode Escargot::esprima::Parser::inheritCoverGrammar<Escargot::SyntaxChecker, Escargot::SyntaxNode (Escargot::esprima::Parser::*)(Escargot::SyntaxChecker&)>(Escargot::SyntaxChecker&, Escargot::SyntaxNode (Escargot::esprima::Parser::*)(Escargot::SyntaxChecker&)) /home/fuzzer/escargot/src/parser/esprima_cpp/esprima.cpp:1008
    #23 0x55f0904ab0c6 in Escargot::SyntaxChecker::ASTNode Escargot::esprima::Parser::parseExponentiationExpression<Escargot::SyntaxChecker>(Escargot::SyntaxChecker&) /home/fuzzer/escargot/src/parser/esprima_cpp/esprima.cpp:2915
    #24 0x55f09046e88b in Escargot::SyntaxChecker::ASTNode Escargot::esprima::Parser::inheritCoverGrammar<Escargot::SyntaxChecker, Escargot::SyntaxNode (Escargot::esprima::Parser::*)(Escargot::SyntaxChecker&)>(Escargot::SyntaxChecker&, Escargot::SyntaxNode (Escargot::esprima::Parser::*)(Escargot::SyntaxChecker&)) /home/fuzzer/escargot/src/parser/esprima_cpp/esprima.cpp:1008
    #25 0x55f09046d154 in Escargot::SyntaxChecker::ASTNode Escargot::esprima::Parser::parseBinaryExpression<Escargot::SyntaxChecker>(Escargot::SyntaxChecker&) /home/fuzzer/escargot/src/parser/esprima_cpp/esprima.cpp:3013
    #26 0x55f09046e88b in Escargot::SyntaxChecker::ASTNode Escargot::esprima::Parser::inheritCoverGrammar<Escargot::SyntaxChecker, Escargot::SyntaxNode (Escargot::esprima::Parser::*)(Escargot::SyntaxChecker&)>(Escargot::SyntaxChecker&, Escargot::SyntaxNode (Escargot::esprima::Parser::*)(Escargot::SyntaxChecker&)) /home/fuzzer/escargot/src/parser/esprima_cpp/esprima.cpp:1008
    #27 0x55f09043f29b in Escargot::SyntaxChecker::ASTNode Escargot::esprima::Parser::parseConditionalExpression<Escargot::SyntaxChecker>(Escargot::SyntaxChecker&) /home/fuzzer/escargot/src/parser/esprima_cpp/esprima.cpp:3164
    #28 0x55f0904094d0 in Escargot::SyntaxChecker::ASTNode Escargot::esprima::Parser::parseAssignmentExpression<Escargot::SyntaxChecker, false>(Escargot::SyntaxChecker&) /home/fuzzer/escargot/src/parser/esprima_cpp/esprima.cpp:3206
    #29 0x55f09040e2c1 in Escargot::SyntaxChecker::ASTNode Escargot::esprima::Parser::isolateCoverGrammar<Escargot::SyntaxChecker, Escargot::SyntaxNode (Escargot::esprima::Parser::*)(Escargot::SyntaxChecker&)>(Escargot::SyntaxChecker&, Escargot::SyntaxNode (Escargot::esprima::Parser::*)(Escargot::SyntaxChecker&)) /home/fuzzer/escargot/src/parser/esprima_cpp/esprima.cpp:984
    #30 0x55f09046c3ec in Escargot::SyntaxChecker::ASTNode Escargot::esprima::Parser::parsePatternWithDefault<Escargot::SyntaxChecker>(Escargot::SyntaxChecker&, Escargot::VectorWithInlineStorage<8u, Escargot::EscargotLexer::Scanner::SmallScannerResult, std::allocator<Escargot::EscargotLexer::Scanner::SmallScannerResult> >&, Escargot::EscargotLexer::KeywordKind, bool) /home/fuzzer/escargot/src/parser/esprima_cpp/esprima.cpp:1451
    #31 0x55f09043e2b1 in Escargot::SyntaxChecker::ASTNode Escargot::esprima::Parser::parseFormalParameter<Escargot::SyntaxChecker>(Escargot::SyntaxChecker&, Escargot::esprima::Parser::ParseFormalParametersResult&) /home/fuzzer/escargot/src/parser/esprima_cpp/esprima.cpp:1473
    #32 0x55f09040762b in void Escargot::esprima::Parser::parseFormalParameters<Escargot::SyntaxChecker>(Escargot::SyntaxChecker&, Escargot::esprima::Parser::ParseFormalParametersResult&, Escargot::EscargotLexer::Scanner::SmallScannerResult*, bool) /home/fuzzer/escargot/src/parser/esprima_cpp/esprima.cpp:1506
    #33 0x55f0903fc67a in Escargot::NodeGenerator::ASTNode Escargot::esprima::Parser::parseFunctionDeclaration<Escargot::NodeGenerator, false>(Escargot::NodeGenerator&, bool) /home/fuzzer/escargot/src/parser/esprima_cpp/esprima.cpp:5305
    #34 0x55f0903e5a63 in Escargot::NodeGenerator::ASTNode Escargot::esprima::Parser::parseStatementListItem<Escargot::NodeGenerator>(Escargot::NodeGenerator&) /home/fuzzer/escargot/src/parser/esprima_cpp/esprima.cpp:3619
    #35 0x55f0903a4a73 in Escargot::esprima::Parser::parseProgram(Escargot::NodeGenerator&) /home/fuzzer/escargot/src/parser/esprima_cpp/esprima.cpp:6874
    #36 0x55f0903a797e in Escargot::esprima::parseProgram(Escargot::Context*, Escargot::StringView, Escargot::ASTClassInfo*, bool, bool, bool, bool, bool, bool, bool) /home/fuzzer/escargot/src/parser/esprima_cpp/esprima.cpp:7100
    #37 0x55f09030928d in Escargot::ScriptParser::initializeScript(Escargot::String*, unsigned long, Escargot::String*, Escargot::String*, Escargot::InterpretedCodeBlock*, bool, bool, bool, bool, bool, bool, bool, bool, bool) /home/fuzzer/escargot/src/parser/ScriptParser.cpp:394
    #38 0x55f08fea2811 in Escargot::ScriptParser::initializeScript(Escargot::String*, Escargot::String*, bool) /home/fuzzer/escargot/src/parser/ScriptParser.h:57
    #39 0x55f08feb63de in Escargot::ScriptParserRef::initializeScript(Escargot::StringRef*, Escargot::StringRef*, bool) /home/fuzzer/escargot/src/api/EscargotPublic.cpp:4642
    #40 0x55f090792a5d in evalScript /home/fuzzer/escargot/src/shell/Shell.cpp:760
    #41 0x55f0907959cd in main /home/fuzzer/escargot/src/shell/Shell.cpp:1149
    #42 0x7f1ba47e8d8f in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
    #43 0x7f1ba47e8e3f in __libc_start_main_impl ../csu/libc-start.c:392
    #44 0x55f08fe938a4 in _start (/home/fuzzer/escargot/escargot+0x2a28a4)

AddressSanitizer can not provide additional info.
SUMMARY: AddressSanitizer: SEGV /home/fuzzer/escargot/src/util/TightVector.h:185 in Escargot::TightVector<Escargot::ASTBlockContextNameInfo, GCUtil::gc_malloc_atomic_allocator<Escargot::ASTBlockContextNameInfo> >::size() const
==49069==ABORTING