diff options
author | Benjamin Kramer <benny.kra@googlemail.com> | 2012-11-08 19:22:31 +0000 |
---|---|---|
committer | Benjamin Kramer <benny.kra@googlemail.com> | 2012-11-08 19:22:31 +0000 |
commit | 4f056ac7f8d837822dbf8ab7cdd6849a9b0ad12f (patch) | |
tree | 1707a924d32141eaa623023a921eb1316ef8eb1f /lib/Lex/LiteralSupport.cpp | |
parent | 5d704fef6e0a7db07329a37290684b17bf6badf8 (diff) | |
download | clang-4f056ac7f8d837822dbf8ab7cdd6849a9b0ad12f.tar.gz clang-4f056ac7f8d837822dbf8ab7cdd6849a9b0ad12f.tar.bz2 clang-4f056ac7f8d837822dbf8ab7cdd6849a9b0ad12f.tar.xz |
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
Diffstat (limited to 'lib/Lex/LiteralSupport.cpp')
-rw-r--r-- | lib/Lex/LiteralSupport.cpp | 11 |
1 files changed, 6 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<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; } |