From: Kazunori Fujiwara Date: Tue, 11 Jun 2013 00:35:08 +0000 (+0900) Subject: [2992] Added errno check to fromStringstreamNumber() X-Git-Tag: bind10-1.2.0beta1-release~410^2~2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=45baa7aba39e666d0eed45e140567ce3be62066e;p=thirdparty%2Fkea.git [2992] Added errno check to fromStringstreamNumber() Now support LONG_MAX, LONG_MIN and floating underflow detection --- diff --git a/src/lib/cc/data.cc b/src/lib/cc/data.cc index af3602abbb..b23ae02d57 100644 --- a/src/lib/cc/data.cc +++ b/src/lib/cc/data.cc @@ -24,6 +24,7 @@ #include #include #include +#include #include // for iequals @@ -395,22 +396,25 @@ fromStringstreamNumber(std::istream& in, int& pos) { double d = 0.0; bool is_double = false; char* endptr; + const char* ptr; std::string number = numberFromStringstream(in, pos); + errno = 0; i = strtol(number.c_str(), &endptr, 10); if (*endptr != '\0') { - d = strtod(number.c_str(), &endptr); + errno = 0; + d = strtod(ptr = number.c_str(), &endptr); is_double = true; - if (*endptr != '\0') { + if (*endptr != '\0' || ptr == endptr) { isc_throw(JSONError, std::string("Bad number: ") + number); } else { - if (d == HUGE_VAL || d == -HUGE_VAL) { + if (errno != 0) { isc_throw(JSONError, std::string("Number overflow: ") + number); } } } else { - if (i == LONG_MAX || i == LONG_MIN) { + if ((i == LONG_MAX || i == LONG_MIN) && errno != 0) { isc_throw(JSONError, std::string("Number overflow: ") + number); } }