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

Side by Side Diff: chrome/browser/safe_browsing/protocol_parser.cc

Issue 582143002: Safebrowsing: Fix failure parsing a gethash result with bad listname and metadata. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: add todo 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 unified diff | Download patch
« no previous file with comments | « no previous file | chrome/browser/safe_browsing/protocol_parser_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 // 4 //
5 // Parse the data returned from the SafeBrowsing v2.1 protocol response. 5 // Parse the data returned from the SafeBrowsing v2.1 protocol response.
6 6
7 // TODOv3(shess): Review these changes carefully. 7 // TODOv3(shess): Review these changes carefully.
8 8
9 #include <stdlib.h> 9 #include <stdlib.h>
10 10
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
124 return true; 124 return true;
125 } 125 }
126 126
127 private: 127 private:
128 const char* data_; 128 const char* data_;
129 size_t length_; 129 size_t length_;
130 130
131 DISALLOW_COPY_AND_ASSIGN(BufferReader); 131 DISALLOW_COPY_AND_ASSIGN(BufferReader);
132 }; 132 };
133 133
134 bool ParseGetHashMetadata(size_t hash_count, BufferReader* reader) {
135 for (size_t i = 0; i < hash_count; ++i) {
136 base::StringPiece line;
137 if (!reader->GetLine(&line))
138 return false;
139
140 size_t meta_data_len;
141 if (!base::StringToSizeT(line, &meta_data_len))
142 return false;
143
144 const void* meta_data;
145 if (!reader->RefData(&meta_data, meta_data_len))
146 return false;
147 }
148 return true;
149 }
150
134 } // namespace 151 } // namespace
135 152
136 namespace safe_browsing { 153 namespace safe_browsing {
137 154
138 // BODY = CACHELIFETIME LF HASHENTRY* EOF 155 // BODY = CACHELIFETIME LF HASHENTRY* EOF
139 // CACHELIFETIME = DIGIT+ 156 // CACHELIFETIME = DIGIT+
140 // HASHENTRY = LISTNAME ":" HASHSIZE ":" NUMRESPONSES [":m"] LF 157 // HASHENTRY = LISTNAME ":" HASHSIZE ":" NUMRESPONSES [":m"] LF
141 // HASHDATA (METADATALEN LF METADATA)* 158 // HASHDATA (METADATALEN LF METADATA)*
142 // HASHSIZE = DIGIT+ # Length of each full hash 159 // HASHSIZE = DIGIT+ # Length of each full hash
143 // NUMRESPONSES = DIGIT+ # Number of full hashes in HASHDATA 160 // NUMRESPONSES = DIGIT+ # Number of full hashes in HASHDATA
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
199 size_t hash_count; 216 size_t hash_count;
200 if (!base::StringToSizeT(hash_count_string, &hash_count)) 217 if (!base::StringToSizeT(hash_count_string, &hash_count))
201 return false; 218 return false;
202 219
203 if (hash_len * hash_count > reader.length()) 220 if (hash_len * hash_count > reader.length())
204 return false; 221 return false;
205 222
206 // Ignore hash results from lists we don't recognize. 223 // Ignore hash results from lists we don't recognize.
207 if (full_hash.list_id < 0) { 224 if (full_hash.list_id < 0) {
208 reader.Advance(hash_len * hash_count); 225 reader.Advance(hash_len * hash_count);
226 if (has_metadata && !ParseGetHashMetadata(hash_count, &reader))
227 return false;
209 continue; 228 continue;
210 } 229 }
211 230
212 for (size_t i = 0; i < hash_count; ++i) { 231 for (size_t i = 0; i < hash_count; ++i) {
213 if (!reader.GetData(&full_hash.hash, hash_len)) 232 if (!reader.GetData(&full_hash.hash, hash_len))
214 return false; 233 return false;
215 full_hashes->push_back(full_hash); 234 full_hashes->push_back(full_hash);
216 } 235 }
217 236
218 // Discard the metadata for now. 237 // Discard the metadata for now.
219 if (has_metadata) { 238 // TODO(mattm): handle the metadata (see crbug.com/176648).
220 for (size_t i = 0; i < hash_count; ++i) { 239 if (has_metadata && !ParseGetHashMetadata(hash_count, &reader))
221 base::StringPiece line; 240 return false;
222 if (!reader.GetLine(&line))
223 return false;
224
225 size_t meta_data_len;
226 if (!base::StringToSizeT(line, &meta_data_len))
227 return false;
228
229 const void* meta_data;
230 if (!reader.RefData(&meta_data, meta_data_len))
231 return false;
232 }
233 }
234 } 241 }
235 242
236 return reader.empty(); 243 return reader.empty();
237 } 244 }
238 245
239 // BODY = HEADER LF PREFIXES EOF 246 // BODY = HEADER LF PREFIXES EOF
240 // HEADER = PREFIXSIZE ":" LENGTH 247 // HEADER = PREFIXSIZE ":" LENGTH
241 // PREFIXSIZE = DIGIT+ # Size of each prefix in bytes 248 // PREFIXSIZE = DIGIT+ # Size of each prefix in bytes
242 // LENGTH = DIGIT+ # Size of PREFIXES in bytes 249 // LENGTH = DIGIT+ # Size of PREFIXES in bytes
243 std::string FormatGetHash(const std::vector<SBPrefix>& prefixes) { 250 std::string FormatGetHash(const std::vector<SBPrefix>& prefixes) {
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
375 if (!list.adds.empty() && !list.subs.empty()) 382 if (!list.adds.empty() && !list.subs.empty())
376 formatted_results.append(":"); 383 formatted_results.append(":");
377 if (!list.subs.empty()) 384 if (!list.subs.empty())
378 formatted_results.append("s:").append(list.subs); 385 formatted_results.append("s:").append(list.subs);
379 formatted_results.append("\n"); 386 formatted_results.append("\n");
380 387
381 return formatted_results; 388 return formatted_results;
382 } 389 }
383 390
384 } // namespace safe_browsing 391 } // namespace safe_browsing
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/safe_browsing/protocol_parser_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698