LiteralSupport: Don't overflow the temporary buffer when decoding invalid string...
authorBenjamin Kramer <benny.kra@googlemail.com>
Thu, 8 Nov 2012 19:22:31 +0000 (19:22 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Thu, 8 Nov 2012 19:22:31 +0000 (19:22 +0000)
Instead just use a dummy buffer, we're not going to use the decoded string anyways.
Fixes PR14292.

llvm-svn: 167594

clang/lib/Lex/LiteralSupport.cpp
clang/test/Misc/unprintable.c

index cd32964..e30612e 100644 (file)
@@ -1421,21 +1421,22 @@ bool StringLiteralParser::CopyStringFragment(const Token &Tok,
            NoErrorOnBadEncoding ? diag::warn_bad_string_encoding
                                 : diag::err_bad_string_encoding);
 
-    char *SavedResultPtr = ResultPtr;
     const char *NextStart = resyncUTF8(ErrorPtr, Fragment.end());
     StringRef NextFragment(NextStart, Fragment.end()-NextStart);
 
+    // Decode into a dummy buffer.
+    SmallString<512> Dummy;
+    Dummy.reserve(Fragment.size() * CharByteWidth);
+    char *Ptr = Dummy.data();
+
     while (!Builder.hasMaxRanges() &&
-           !ConvertUTF8toWide(CharByteWidth, NextFragment, ResultPtr,
-                              ErrorPtrTmp)) {
+           !ConvertUTF8toWide(CharByteWidth, NextFragment, Ptr, ErrorPtrTmp)) {
       const char *ErrorPtr = reinterpret_cast<const char *>(ErrorPtrTmp);
       NextStart = resyncUTF8(ErrorPtr, Fragment.end());
       Builder << MakeCharSourceRange(Features, SourceLoc, TokBegin,
                                      ErrorPtr, NextStart);
       NextFragment = StringRef(NextStart, Fragment.end()-NextStart);
     }
-
-    ResultPtr = SavedResultPtr;
   }
   return !NoErrorOnBadEncoding;
 }
index b71fe74..cd97131 100644 (file)
@@ -30,4 +30,10 @@ int main() {
 // CHECK: {{^    /\* <U\+FFFE> \*/ "<U\+FFFE>berhund";}}
 // CHECK: {{^                   \^~~~~~~~~~~~~~~~~}}
 
+
+// PR14292
+    "xĀ°xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
+// CHECK: {{^    "x<B0>}}
+// CHECK: {{^    \^}}
+
 }