diff options
author | Ted Kremenek <kremenek@apple.com> | 2009-10-23 03:57:22 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2009-10-23 03:57:22 +0000 |
commit | 49c5232d9f1fcd6af0e35f1613fc7fa2ddaba98b (patch) | |
tree | cbff8f9e4f9e94eaf023171a4acfe73b10aabbf0 | |
parent | d73d7add37f751a89e99bcc0fb1c0fcb82d98144 (diff) | |
download | bcm5719-llvm-49c5232d9f1fcd6af0e35f1613fc7fa2ddaba98b.tar.gz bcm5719-llvm-49c5232d9f1fcd6af0e35f1613fc7fa2ddaba98b.zip |
Fix integer overflow in PCHReader when reading the length of an
identifier. This caused a crash when reading PCH files that contained
long identifier names.
The issue is that 'StrLenPtr' was previously a 'const char *', meaning
the byte loaded from it would be interpretted as a signed integer. If
the topmost bit was set, conversion to 'unsigned' would extend that
bit, causing an overflow.
The solution is to make 'StrLenPtr' an 'unsigned char *', always
treating the value as an unsigned integer.
This fixes: <rdar://problem/7328900>
llvm-svn: 84925
-rw-r--r-- | clang/lib/Frontend/PCHReader.cpp | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/clang/lib/Frontend/PCHReader.cpp b/clang/lib/Frontend/PCHReader.cpp index e804bfc90eb..d4302f44c8b 100644 --- a/clang/lib/Frontend/PCHReader.cpp +++ b/clang/lib/Frontend/PCHReader.cpp @@ -2515,7 +2515,7 @@ IdentifierInfo *PCHReader::DecodeIdentifierInfo(unsigned ID) { // All of the strings in the PCH file are preceded by a 16-bit // length. Extract that 16-bit length to avoid having to execute // strlen(). - const char *StrLenPtr = Str - 2; + const unsigned char *StrLenPtr = (const unsigned char*) Str - 2; unsigned StrLen = (((unsigned) StrLenPtr[0]) | (((unsigned) StrLenPtr[1]) << 8)) - 1; IdentifiersLoaded[ID - 1] |