summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Kramer <benny.kra@googlemail.com>2012-11-08 19:22:31 +0000
committerBenjamin Kramer <benny.kra@googlemail.com>2012-11-08 19:22:31 +0000
commit4f056ac7f8d837822dbf8ab7cdd6849a9b0ad12f (patch)
tree1707a924d32141eaa623023a921eb1316ef8eb1f
parent5d704fef6e0a7db07329a37290684b17bf6badf8 (diff)
downloadclang-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
-rw-r--r--lib/Lex/LiteralSupport.cpp11
-rw-r--r--test/Misc/unprintable.c6
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<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;
}
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: {{^ /\* <U\+FFFE> \*/ "<U\+FFFE>berhund";}}
// CHECK: {{^ \^~~~~~~~~~~~~~~~~}}
+
+// PR14292
+ "x°xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
+// CHECK: {{^ "x<B0>}}
+// CHECK: {{^ \^}}
+
}