diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2016-05-15 18:40:50 +0900 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2016-05-15 18:40:50 +0900 |
| commit | bafbbe7c1d5ea39e67e233f9c32975fda7843874 (patch) | |
| tree | f89e784f062e108935662c52f66eb559f6de61db /src | |
| parent | 6976ffed9e96ccc70f161aa5a38abddaf9d9befe (diff) | |
Allow subsecond value in ns cookie.txt file's expiry time field
Diffstat (limited to 'src')
| -rw-r--r-- | src/NsCookieParser.cc | 11 | ||||
| -rw-r--r-- | src/util.cc | 27 | ||||
| -rw-r--r-- | src/util.h | 4 |
3 files changed, 39 insertions, 3 deletions
diff --git a/src/NsCookieParser.cc b/src/NsCookieParser.cc index e484df8e..77ca25ab 100644 --- a/src/NsCookieParser.cc +++ b/src/NsCookieParser.cc @@ -69,9 +69,14 @@ std::unique_ptr<Cookie> parseNsCookie(const std::string& cookieStr, return nullptr; } int64_t expiryTime; - if (!util::parseLLIntNoThrow(expiryTime, - std::string(vs[4].first, vs[4].second))) { - return nullptr; + { + // chrome extension uses subsecond resolution for expiry time. + double expiryTimeDouble; + if (!util::parseDoubleNoThrow(expiryTimeDouble, + std::string(vs[4].first, vs[4].second))) { + return nullptr; + } + expiryTime = static_cast<int64_t>(expiryTimeDouble); } if (std::numeric_limits<time_t>::max() < expiryTime) { expiryTime = std::numeric_limits<time_t>::max(); diff --git a/src/util.cc b/src/util.cc index a2590235..3c9c19b1 100644 --- a/src/util.cc +++ b/src/util.cc @@ -596,6 +596,33 @@ bool parseLLIntNoThrow(int64_t& res, const std::string& s, int base) } } +bool parseDoubleNoThrow(double& res, const std::string& s) +{ + if (s.empty()) { + return false; + } + + errno = 0; + char* endptr; + auto d = strtod(s.c_str(), &endptr); + + if (errno == ERANGE) { + return false; + } + + if (endptr != s.c_str() + s.size()) { + for (auto i = std::begin(s) + (endptr - s.c_str()); i != std::end(s); ++i) { + if (!isspace(*i)) { + return false; + } + } + } + + res = d; + + return true; +} + SegList<int> parseIntSegments(const std::string& src) { SegList<int> sgl; @@ -280,6 +280,10 @@ bool parseUIntNoThrow(uint32_t& res, const std::string& s, int base = 10); bool parseLLIntNoThrow(int64_t& res, const std::string& s, int base = 10); +// Parses |s| as floating point number, and stores the result into +// |res|. This function returns true if it succeeds. +bool parseDoubleNoThrow(double& res, const std::string& s); + SegList<int> parseIntSegments(const std::string& src); // Parses string which specifies the range of piece index for higher |
