From 4f056ac7f8d837822dbf8ab7cdd6849a9b0ad12f Mon Sep 17 00:00:00 2001 From: Benjamin Kramer Date: Thu, 8 Nov 2012 19:22:31 +0000 Subject: [PATCH] LiteralSupport: Don't overflow the temporary buffer when decoding invalid string parts. Instead just use a dummy buffer, we're not going to use the decoded string anyways. Fixes PR14292. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@167594 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Lex/LiteralSupport.cpp | 11 ++++++----- test/Misc/unprintable.c | 6 ++++++ 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/lib/Lex/LiteralSupport.cpp b/lib/Lex/LiteralSupport.cpp index cd32964367..e30612e57c 100644 --- a/lib/Lex/LiteralSupport.cpp +++ b/lib/Lex/LiteralSupport.cpp @@ -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(ErrorPtrTmp); NextStart = resyncUTF8(ErrorPtr, Fragment.end()); Builder << MakeCharSourceRange(Features, SourceLoc, TokBegin, ErrorPtr, NextStart); NextFragment = StringRef(NextStart, Fragment.end()-NextStart); } - - ResultPtr = SavedResultPtr; } return !NoErrorOnBadEncoding; } diff --git a/test/Misc/unprintable.c b/test/Misc/unprintable.c index b71fe74113..cd97131c8d 100644 --- a/test/Misc/unprintable.c +++ b/test/Misc/unprintable.c @@ -30,4 +30,10 @@ int main() { // CHECK: {{^ /\* \*/ "berhund";}} // CHECK: {{^ \^~~~~~~~~~~~~~~~~}} + +// PR14292 + "xĀ°xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +// CHECK: {{^ "x}} +// CHECK: {{^ \^}} + } -- 2.40.0