Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(111)

Unified Diff: net/base/sdch_manager.cc

Issue 574283006: Fix dictionary domain check problem. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Incorporated comments and forbid dictionary domains with "."s. Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/base/sdch_manager.h ('k') | net/base/sdch_manager_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/base/sdch_manager.cc
diff --git a/net/base/sdch_manager.cc b/net/base/sdch_manager.cc
index 59589fb544723d386fa37019dd30a574cd8432d0..32f09da6c85f9b2712b5be437ace1ff0809987d3 100644
--- a/net/base/sdch_manager.cc
+++ b/net/base/sdch_manager.cc
@@ -13,6 +13,40 @@
#include "net/base/registry_controlled_domains/registry_controlled_domain.h"
#include "net/url_request/url_request_http_job.h"
+namespace {
+
+// Spec collision warning: URLs may have domain names which have a
+// trailing "." (e.g. "http://this.is.a.domain.com./file.txt"). The
+// SDCH spec was written to parallel RFC 2965 (an old version of the
+// cookie spec, which didn't precisely address the issue of trailing "."s.
+// The newest version of the cookie spec, RFC 6265, specifically prohibits
+// trailing "."s from cookie domains. So we prohibit trailing "."s in
+// dictionary domains, and strip any trailing "." from URL domains.
+bool StripTrailingDot(std::string* host) {
+ if (host->size() == 0)
Ryan Sleevi 2014/09/22 20:30:37 host->empty() (a nit I hold on to from the days o
Randy Smith (Not in Mondays) 2014/09/23 19:52:58 Done.
+ return false;
+
+ if ((*host)[host->size() - 1] != '.')
Ryan Sleevi 2014/09/22 20:30:36 if (*host->rbegin() != '.') return false; Lazin
Randy Smith (Not in Mondays) 2014/09/23 19:52:58 Agreed :-}. Done.
+ return false;
+
+ host->resize(host->size() - 1);
+ return true;
+}
+
+void StripTrailingDotURL(GURL* gurl) {
Ryan Sleevi 2014/09/22 20:30:36 naming wise, this felt a little weird, although I
Randy Smith (Not in Mondays) 2014/09/23 19:52:58 I don't want "NormalizeToDictionary" because to me
+ std::string host(gurl->host());
+
+ if (!StripTrailingDot(&host))
+ return;
Ryan Sleevi 2014/09/22 20:30:36 Just inline this? You never use "StripTrailingDot"
Randy Smith (Not in Mondays) 2014/09/23 19:52:58 Done.
+
+ GURL::Replacements replacements;
+ replacements.SetHostStr(host);
+ *gurl = gurl->ReplaceComponents(replacements);
+ return;
+}
+
+} // namespace
+
namespace net {
//------------------------------------------------------------------------------
@@ -405,15 +439,19 @@ void SdchManager::GetVcdiffDictionary(
const GURL& referring_url,
scoped_refptr<Dictionary>* dictionary) {
DCHECK(CalledOnValidThread());
+
+ GURL referring_url_hdn(referring_url);
+ StripTrailingDotURL(&referring_url_hdn);
+
*dictionary = NULL;
DictionaryMap::iterator it = dictionaries_.find(server_hash);
if (it == dictionaries_.end()) {
return;
}
scoped_refptr<Dictionary> matching_dictionary = it->second;
- if (!IsInSupportedDomain(referring_url))
+ if (!IsInSupportedDomain(referring_url_hdn))
return;
- if (!matching_dictionary->CanUse(referring_url))
+ if (!matching_dictionary->CanUse(referring_url_hdn))
Ryan Sleevi 2014/09/22 20:30:37 OK, I'm fairly confused now why it's necessary to
Randy Smith (Not in Mondays) 2014/09/22 20:43:51 This isn't necessary; it's the checks in AddSdchDi
return;
*dictionary = matching_dictionary;
}
@@ -424,12 +462,16 @@ void SdchManager::GetVcdiffDictionary(
void SdchManager::GetAvailDictionaryList(const GURL& target_url,
std::string* list) {
DCHECK(CalledOnValidThread());
+
+ GURL target_url_hdn(target_url);
+ StripTrailingDotURL(&target_url_hdn);
+
int count = 0;
for (DictionaryMap::iterator it = dictionaries_.begin();
it != dictionaries_.end(); ++it) {
- if (!IsInSupportedDomain(target_url))
+ if (!IsInSupportedDomain(target_url_hdn))
continue;
- if (!it->second->CanAdvertise(target_url))
+ if (!it->second->CanAdvertise(target_url_hdn))
continue;
++count;
if (!list->empty())
@@ -479,7 +521,7 @@ void SdchManager::SetAllowLatencyExperiment(const GURL& url, bool enable) {
}
void SdchManager::AddSdchDictionary(const std::string& dictionary_text,
Ryan Sleevi 2014/09/22 20:55:26 style nits: Perhaps for a future CL, but this shou
- const GURL& dictionary_url) {
+ const GURL& dictionary_url_const) {
Ryan Sleevi 2014/09/22 20:55:26 pedantry naming: dictionary_url here, and normaliz
Randy Smith (Not in Mondays) 2014/09/23 19:52:58 Done.
DCHECK(CalledOnValidThread());
std::string client_hash;
std::string server_hash;
@@ -550,6 +592,19 @@ void SdchManager::AddSdchDictionary(const std::string& dictionary_text,
line_start = line_end + 1;
Ryan Sleevi 2014/09/22 20:55:27 if line_end == npos, this will wrap around to 0 (s
}
+ // Forbid dictionary with trailing dots; the SDCH spec is explicitly
+ // patterned after an old cookie spec (RFC 2695) which is silent on
+ // the issue of trailing dots, and the newer cookie spec (RFC 6265)
+ // explicitly forbids them.
+ if (domain.size() != 0 && domain[domain.size() - 1] == '.') {
+ SdchErrorRecovery(DICTIONARY_DOMAIN_HAS_TRAILING_PERIOD);
+ return;
Ryan Sleevi 2014/09/22 20:55:27 From your reply, it _seems_ that this is the ONLY
Randy Smith (Not in Mondays) 2014/09/22 21:09:56 I don't believe so; I think the stripping of the d
Ryan Sleevi 2014/09/22 22:49:42 I tried to work through why this is. That is, I'm
+ }
+
+ // Strip trailing dot from the dictionary url before comparison.
+ GURL dictionary_url(dictionary_url_const);
+ StripTrailingDotURL(&dictionary_url);
Randy Smith (Not in Mondays) 2014/09/23 17:36:43 >> I believe this is the only change required to s
+
if (!IsInSupportedDomain(dictionary_url))
return;
« no previous file with comments | « net/base/sdch_manager.h ('k') | net/base/sdch_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698