summaryrefslogtreecommitdiffstats
path: root/net/http
diff options
context:
space:
mode:
authormpcomplete@chromium.org <mpcomplete@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-12-01 04:34:13 +0000
committermpcomplete@chromium.org <mpcomplete@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-12-01 04:34:13 +0000
commit74bdf9a049376428c7d7bf7e58ba081de890481b (patch)
treebd583c445e7f68103a5030f1c0d961b776fcc4e2 /net/http
parentaee236542a8a66aa8d402fe891a0a7919a039963 (diff)
downloadchromium_src-74bdf9a049376428c7d7bf7e58ba081de890481b.zip
chromium_src-74bdf9a049376428c7d7bf7e58ba081de890481b.tar.gz
chromium_src-74bdf9a049376428c7d7bf7e58ba081de890481b.tar.bz2
Ensure HttpResponseHeaders::raw_headers_ always ends with 2 '\0' characters.
BUG=105971 TEST=no Review URL: http://codereview.chromium.org/8760010 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@112401 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/http')
-rw-r--r--net/http/http_response_headers.cc19
-rw-r--r--net/http/http_response_headers.h2
2 files changed, 16 insertions, 5 deletions
diff --git a/net/http/http_response_headers.cc b/net/http/http_response_headers.cc
index 691536b3..f249db8 100644
--- a/net/http/http_response_headers.cc
+++ b/net/http/http_response_headers.cc
@@ -390,9 +390,13 @@ void HttpResponseHeaders::Parse(const std::string& raw_input) {
(line_end + 1) != raw_input.end() &&
*(line_end + 1) != '\0');
ParseStatusLine(line_begin, line_end, has_headers);
+ raw_headers_.push_back('\0'); // Terminate status line with a null.
if (line_end == raw_input.end()) {
- raw_headers_.push_back('\0');
+ raw_headers_.push_back('\0'); // Ensure the headers end with a double null.
+
+ DCHECK_EQ('\0', raw_headers_[raw_headers_.size() - 2]);
+ DCHECK_EQ('\0', raw_headers_[raw_headers_.size() - 1]);
return;
}
@@ -403,6 +407,13 @@ void HttpResponseHeaders::Parse(const std::string& raw_input) {
// it (to populate our parsed_ vector).
raw_headers_.append(line_end + 1, raw_input.end());
+ // Ensure the headers end with a double null.
+ while (raw_headers_.size() < 2 ||
+ raw_headers_[raw_headers_.size() - 2] != '\0' ||
+ raw_headers_[raw_headers_.size() - 1] != '\0') {
+ raw_headers_.push_back('\0');
+ }
+
// Adjust to point at the null byte following the status line
line_end = raw_headers_.begin() + status_line_len - 1;
@@ -414,6 +425,9 @@ void HttpResponseHeaders::Parse(const std::string& raw_input) {
headers.values_begin(),
headers.values_end());
}
+
+ DCHECK_EQ('\0', raw_headers_[raw_headers_.size() - 2]);
+ DCHECK_EQ('\0', raw_headers_[raw_headers_.size() - 1]);
}
// Append all of our headers to the final output string.
@@ -663,7 +677,6 @@ void HttpResponseHeaders::ParseStatusLine(
if (p == line_end) {
DVLOG(1) << "missing response status; assuming 200 OK";
raw_headers_.append(" 200 OK");
- raw_headers_.push_back('\0');
response_code_ = 200;
return;
}
@@ -703,8 +716,6 @@ void HttpResponseHeaders::ParseStatusLine(
} else {
raw_headers_.append(p, line_end);
}
-
- raw_headers_.push_back('\0');
}
size_t HttpResponseHeaders::FindHeader(size_t from,
diff --git a/net/http/http_response_headers.h b/net/http/http_response_headers.h
index e331389..c4636a6 100644
--- a/net/http/http_response_headers.h
+++ b/net/http/http_response_headers.h
@@ -278,7 +278,7 @@ class NET_EXPORT HttpResponseHeaders
// construct a valid one. Example input:
// HTTP/1.1 200 OK
// with line_begin and end pointing at the begin and end of this line.
- // Output will be a normalized version of this, with a trailing \n.
+ // Output will be a normalized version of this.
void ParseStatusLine(std::string::const_iterator line_begin,
std::string::const_iterator line_end,
bool has_headers);