From: David Majnemer Date: Sun, 14 Dec 2014 04:53:11 +0000 (+0000) Subject: Lex: Don't crash if both conflict markers are on the same line X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7ac2ac0e70c92114bcd1257db7d455aa965c82af;p=clang Lex: Don't crash if both conflict markers are on the same line We would check if the terminator marker is on a newline. However, the logic would end up out-of-bounds if the terminator marker immediately follows the start marker. This fixes PR21820. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@224210 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Lex/Lexer.cpp b/lib/Lex/Lexer.cpp index c2e9716123..ca5252e1c9 100644 --- a/lib/Lex/Lexer.cpp +++ b/lib/Lex/Lexer.cpp @@ -2588,8 +2588,8 @@ static const char *FindConflictEnd(const char *CurPtr, const char *BufferEnd, size_t Pos = RestOfBuffer.find(Terminator); while (Pos != StringRef::npos) { // Must occur at start of line. - if (RestOfBuffer[Pos-1] != '\r' && - RestOfBuffer[Pos-1] != '\n') { + if (Pos == 0 || + (RestOfBuffer[Pos - 1] != '\r' && RestOfBuffer[Pos - 1] != '\n')) { RestOfBuffer = RestOfBuffer.substr(Pos+TermLen); Pos = RestOfBuffer.find(Terminator); continue; diff --git a/test/Lexer/conflict-marker.c b/test/Lexer/conflict-marker.c index e5bc7f33e4..2611827d2a 100644 --- a/test/Lexer/conflict-marker.c +++ b/test/Lexer/conflict-marker.c @@ -36,3 +36,5 @@ int foo() { y a = x; return x + a - z; } + +<<<<<<<>>>>>>> // expected-error {{expected identifier}}