| Index: net/base/transport_security_state.cc
|
| diff --git a/net/base/transport_security_state.cc b/net/base/transport_security_state.cc
|
| index 3014e211c47843c008a90d95864c01b11eab7469..5cf85a152d0a5641fbdaf2f8ec4d6339f3717158 100644
|
| --- a/net/base/transport_security_state.cc
|
| +++ b/net/base/transport_security_state.cc
|
| @@ -20,6 +20,8 @@
|
|
|
| namespace net {
|
|
|
| +const long int TransportSecurityState::kMaxHSTSAgeSecs = 86400 * 365; // 1 year
|
| +
|
| TransportSecurityState::TransportSecurityState()
|
| : delegate_(NULL) {
|
| }
|
| @@ -98,6 +100,24 @@ bool TransportSecurityState::IsEnabledForHost(DomainState* result,
|
| return false;
|
| }
|
|
|
| +// MaxAgeToInt converts a string representation of a number of seconds into a
|
| +// int. We use strtol in order to handle overflow correctly. The string may
|
| +// contain an arbitary number which we should truncate correctly rather than
|
| +// throwing a parse failure.
|
| +static bool MaxAgeToInt(std::string::const_iterator begin,
|
| + std::string::const_iterator end,
|
| + int* result) {
|
| + const std::string s(begin, end);
|
| + char* endptr;
|
| + long int i = strtol(s.data(), &endptr, 10 /* base */);
|
| + if (*endptr || i < 0)
|
| + return false;
|
| + if (i > TransportSecurityState::kMaxHSTSAgeSecs)
|
| + i = TransportSecurityState::kMaxHSTSAgeSecs;
|
| + *result = i;
|
| + return true;
|
| +}
|
| +
|
| // "Strict-Transport-Security" ":"
|
| // "max-age" "=" delta-seconds [ ";" "includeSubDomains" ]
|
| bool TransportSecurityState::ParseHeader(const std::string& value,
|
| @@ -106,7 +126,7 @@ bool TransportSecurityState::ParseHeader(const std::string& value,
|
| DCHECK(max_age);
|
| DCHECK(include_subdomains);
|
|
|
| - int max_age_candidate;
|
| + int max_age_candidate = 0;
|
|
|
| enum ParserState {
|
| START,
|
| @@ -142,11 +162,9 @@ bool TransportSecurityState::ParseHeader(const std::string& value,
|
| case AFTER_MAX_AGE_EQUALS:
|
| if (IsAsciiWhitespace(*tokenizer.token_begin()))
|
| continue;
|
| - if (!base::StringToInt(tokenizer.token_begin(),
|
| - tokenizer.token_end(),
|
| - &max_age_candidate))
|
| - return false;
|
| - if (max_age_candidate < 0)
|
| + if (!MaxAgeToInt(tokenizer.token_begin(),
|
| + tokenizer.token_end(),
|
| + &max_age_candidate))
|
| return false;
|
| state = AFTER_MAX_AGE;
|
| break;
|
|
|