]> granicus.if.org Git - clang/commitdiff
[Lex] Avoid out-of-bounds dereference in SkipLineComment
authorAlex Lorenz <arphaman@gmail.com>
Sat, 14 Oct 2017 01:18:30 +0000 (01:18 +0000)
committerAlex Lorenz <arphaman@gmail.com>
Sat, 14 Oct 2017 01:18:30 +0000 (01:18 +0000)
Credit to OSS-Fuzz for discovery:
https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=3145

rdar://34526482

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@315785 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Lex/Lexer.cpp
unittests/Lex/LexerTest.cpp

index 0c179c0fb875a29965ff6923ff6a73635affa9b1..b85e0f03dc06727042ab1f77ed59ce3798505948 100644 (file)
@@ -2144,7 +2144,8 @@ bool Lexer::SkipLineComment(Token &Result, const char *CurPtr,
     // If we read multiple characters, and one of those characters was a \r or
     // \n, then we had an escaped newline within the comment.  Emit diagnostic
     // unless the next line is also a // comment.
-    if (CurPtr != OldPtr+1 && C != '/' && CurPtr[0] != '/') {
+    if (CurPtr != OldPtr + 1 && C != '/' &&
+        (CurPtr == BufferEnd + 1 || CurPtr[0] != '/')) {
       for (; OldPtr != CurPtr; ++OldPtr)
         if (OldPtr[0] == '\n' || OldPtr[0] == '\r') {
           // Okay, we found a // comment that ends in a newline, if the next
index 35eee121384818476f9573b2f722541e5823497c..894f8c7fd89ad7583d3a9ab7699cd666988ae172 100644 (file)
@@ -473,4 +473,9 @@ TEST_F(LexerTest, GetBeginningOfTokenWithEscapedNewLine) {
   }
 }
 
+TEST_F(LexerTest, AvoidPastEndOfStringDereference) {
+  std::vector<Token> LexedTokens = Lex("  //  \\\n");
+  EXPECT_TRUE(LexedTokens.empty());
+}
+
 } // anonymous namespace