aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2007-11-29 00:54:29 +0000
committerTed Kremenek <kremenek@apple.com>2007-11-29 00:54:29 +0000
commit32e61bf91fba3c7946b9f71918202e5e55859a5c (patch)
tree9befc3e2f6f29982a80f6974c658d2ec6ef526e4
parent1f6443255894429fba384de0d5b6389ef578a5e9 (diff)
Removed potential buffer overrun (spotted by Neil Booth) when NumericLiteralParser
converts a parsed literal into an APFloat. We are still performing a copy of the string, which hopefully will be removed eventually for performance reasons. This version now is at least safe. Changed rounding in APFloat construction in NumericLiteralParser from rmTowardsZero to rmNearestTiesToEven. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@44422 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--Lex/LiteralSupport.cpp21
1 files changed, 8 insertions, 13 deletions
diff --git a/Lex/LiteralSupport.cpp b/Lex/LiteralSupport.cpp
index ebc66271db..f6d1a867a3 100644
--- a/Lex/LiteralSupport.cpp
+++ b/Lex/LiteralSupport.cpp
@@ -413,26 +413,21 @@ llvm::APFloat NumericLiteralParser::
GetFloatValue(const llvm::fltSemantics &Format, bool* isExact) {
using llvm::APFloat;
- char floatChars[256];
- strncpy(floatChars, ThisTokBegin, ThisTokEnd-ThisTokBegin);
- floatChars[ThisTokEnd-ThisTokBegin] = '\0';
-
-#if 1
+ llvm::SmallVector<char,256> floatChars;
+ for (unsigned i = 0, n = ThisTokEnd-ThisTokBegin; i != n; ++i)
+ floatChars.push_back(ThisTokBegin[i]);
+
+ floatChars.push_back('\0');
+
APFloat V (Format, APFloat::fcZero, false);
-
APFloat::opStatus status;
- status = V.convertFromString(floatChars,APFloat::rmTowardZero);
+
+ status = V.convertFromString(&floatChars[0],APFloat::rmNearestTiesToEven);
if (isExact)
*isExact = status == APFloat::opOK;
return V;
-#else
- // FIXME: this is horrible!
- APFloat V(strtod(floatChars, 0));
- V.convert(Format, APFloat::rmTowardZero);
- return V;
-#endif
}
void NumericLiteralParser::Diag(SourceLocation Loc, unsigned DiagID,