[clang][lex] Fix lexing malformed pragma within include directive (#138165)

this patch fixes a crash triggered by lexing past eof when emitting a
diagnostic for a malformed `_Pragma` directive within an `include`
directive.
Fixed by by preventing the lexer from eating a `tok::eod`.

Fixes #138094
This commit is contained in:
Stefan Weigl-Bosker
2025-05-05 07:29:41 -04:00
committed by GitHub
parent 43c05d9738
commit 112291ad35
3 changed files with 9 additions and 3 deletions

View File

@@ -550,7 +550,9 @@ Bug Fixes in This Version
- Fixed visibility calculation for template functions. (#GH103477)
- Fixed a bug where an attribute before a ``pragma clang attribute`` or
``pragma clang __debug`` would cause an assertion. Instead, this now diagnoses
the invalid attribute location appropriately. (#GH137861)
the invalid attribute location appropriately. (#GH137861)
- Fixed a crash when a malformed ``_Pragma`` directive appears as part of an
``#include`` directive. (#GH138094)
Bug Fixes to Compiler Builtins
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

View File

@@ -220,11 +220,11 @@ void Preprocessor::Handle_Pragma(Token &Tok) {
if (!tok::isStringLiteral(Tok.getKind())) {
Diag(PragmaLoc, diag::err__Pragma_malformed);
// Skip bad tokens, and the ')', if present.
if (Tok.isNot(tok::r_paren) && Tok.isNot(tok::eof))
if (Tok.isNot(tok::r_paren) && Tok.isNot(tok::eof) && Tok.isNot(tok::eod))
Lex(Tok);
while (Tok.isNot(tok::r_paren) &&
!Tok.isAtStartOfLine() &&
Tok.isNot(tok::eof))
Tok.isNot(tok::eof) && Tok.isNot(tok::eod))
Lex(Tok);
if (Tok.is(tok::r_paren))
Lex(Tok);

View File

@@ -0,0 +1,4 @@
// RUN: %clang_cc1 -E %s -verify
// Don't crash, verify that diagnostics are preserved
#include _Pragma( // expected-error {{_Pragma takes a parenthesized string literal}} expected-error {{expected "FILENAME"}}