Index: net/cookies/cookie_monster.cc |
diff --git a/net/cookies/cookie_monster.cc b/net/cookies/cookie_monster.cc |
index 2272d7b08ab49ca58e9ce4024cd2ebb369efdc07..29dc97f02fd7f4e1ed7f0b8912f1940e74953409 100644 |
--- a/net/cookies/cookie_monster.cc |
+++ b/net/cookies/cookie_monster.cc |
@@ -1058,16 +1058,45 @@ bool CookieMonster::SetCookieWithDetails(const GURL& url, |
last_time_seen_ = actual_creation_time; |
} |
+ // Validate consistency of passed arguments. |
+ if (ParsedCookie::ParseTokenString(name) != name) |
+ return false; |
+ if (ParsedCookie::ParseValueString(value) != value) |
+ return false; |
+ if (ParsedCookie::ParseValueString(domain) != domain) |
+ return false; |
+ if (ParsedCookie::ParseValueString(path) != path) |
+ return false; |
mmenke
2017/05/09 16:51:09
optional: Maybe just merge these into one if?
Randy Smith (Not in Mondays)
2017/05/09 23:52:35
Done.
|
+ |
+ // Validate passed arguments against URL. |
+ if (secure && !url.SchemeIsCryptographic()) |
+ return false; |
+ |
+ std::string cookie_domain; |
+ if (!cookie_util::GetCookieDomainWithString(url, domain, &cookie_domain)) |
+ return false; |
+ |
+ std::string cookie_path = CanonicalCookie::CanonPathWithString(url, path); |
+ if (!path.empty() && cookie_path != path) |
+ return false; |
+ |
+ // Canonicalize path again to make sure it escapes characters as needed. |
+ url::Component path_component(0, cookie_path.length()); |
+ url::RawCanonOutputT<char> canon_path; |
+ url::Component canon_path_component; |
+ url::CanonicalizePath(cookie_path.data(), path_component, &canon_path, |
+ &canon_path_component); |
+ cookie_path = std::string(canon_path.data() + canon_path_component.begin, |
+ canon_path_component.len); |
+ |
std::unique_ptr<CanonicalCookie> cc(CanonicalCookie::Create( |
- url, name, value, domain, path, actual_creation_time, expiration_time, |
- secure, http_only, same_site, priority)); |
+ name, value, cookie_domain, cookie_path, actual_creation_time, |
+ expiration_time, last_access_time, secure, http_only, same_site, |
+ priority)); |
if (!cc.get()) |
return false; |
- if (!last_access_time.is_null()) |
- cc->SetLastAccessDate(last_access_time); |
- |
CookieOptions options; |
options.set_include_httponly(); |
options.set_same_site_cookie_mode( |