diff --git a/lib/preprocessor.cpp b/lib/preprocessor.cpp index b10ff859ad6..d99914357b4 100644 --- a/lib/preprocessor.cpp +++ b/lib/preprocessor.cpp @@ -1058,6 +1058,7 @@ void Preprocessor::simplifyPragmaAsmPrivate(simplecpp::TokenList &tokenList) continue; const simplecpp::Token *endasm = tok3; + bool foundEndasm = false; while ((endasm = endasm->next) != nullptr) { if (endasm->op != '#' || sameline(endasm,endasm->previousSkipComments())) continue; @@ -1069,9 +1070,13 @@ void Preprocessor::simplifyPragmaAsmPrivate(simplecpp::TokenList &tokenList) continue; while (sameline(endasm,endasm3)) endasm = endasm->next; + foundEndasm = true; break; } + if (!foundEndasm) + throw InternalError(nullptr, "syntax error: missing #pragma endasm", InternalError::SYNTAX); + const simplecpp::Token * const tok4 = tok3->next; tok->setstr("asm"); const_cast(tok2)->setstr("("); diff --git a/test/cli/fuzz-crash/crash-ef635709a2489083534cd422e6a089daab23ec64 b/test/cli/fuzz-crash/crash-ef635709a2489083534cd422e6a089daab23ec64 new file mode 100644 index 00000000000..6274e3a27a1 --- /dev/null +++ b/test/cli/fuzz-crash/crash-ef635709a2489083534cd422e6a089daab23ec64 @@ -0,0 +1 @@ +#pragma asm \ No newline at end of file diff --git a/test/testpreprocessor.cpp b/test/testpreprocessor.cpp index 781f6b6cf35..e0472d121a1 100644 --- a/test/testpreprocessor.cpp +++ b/test/testpreprocessor.cpp @@ -362,6 +362,8 @@ class TestPreprocessor : public TestFixture { TEST_CASE(standard); TEST_CASE(writeLocations); + + TEST_CASE(pragmaAsm); } template @@ -2773,6 +2775,12 @@ class TestPreprocessor : public TestFixture { "} ;", processed); } + + void pragmaAsm() + { + const char code[] = "#pragma asm"; + ASSERT_THROW_INTERNAL(getcodeforcfg(settingsDefault, *this, code, "", "test.cpp"), InternalError::SYNTAX); + } }; REGISTER_TEST(TestPreprocessor)