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 | 7d574e269dbbebc7a7ab95de77c86475010c164a (patch) | |
| tree | 2264420721b898760f5e2f9753ba801290ad8763 /clang/lib/Lex | |
| parent | f23a6e6f80e40af60a23105565704dac90b1ccf2 (diff) | |
| download | bcm5719-llvm-7d574e269dbbebc7a7ab95de77c86475010c164a.tar.gz bcm5719-llvm-7d574e269dbbebc7a7ab95de77c86475010c164a.zip | |
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.
llvm-svn: 167594
Diffstat (limited to 'clang/lib/Lex')
| -rw-r--r-- | clang/lib/Lex/LiteralSupport.cpp | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/clang/lib/Lex/LiteralSupport.cpp b/clang/lib/Lex/LiteralSupport.cpp index cd32964367b..e30612e57c5 100644 --- a/clang/lib/Lex/LiteralSupport.cpp +++ b/clang/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; } |

