diff options
author | mpcomplete@chromium.org <mpcomplete@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-12-01 04:34:13 +0000 |
---|---|---|
committer | mpcomplete@chromium.org <mpcomplete@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-12-01 04:34:13 +0000 |
commit | 74bdf9a049376428c7d7bf7e58ba081de890481b (patch) | |
tree | bd583c445e7f68103a5030f1c0d961b776fcc4e2 /net/http | |
parent | aee236542a8a66aa8d402fe891a0a7919a039963 (diff) | |
download | chromium_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.cc | 19 | ||||
-rw-r--r-- | net/http/http_response_headers.h | 2 |
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); |