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

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

Issue 10896048: Transition safe browsing from bloom filter to prefix set. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix prefix set read/write for empty/sparse sets. Created 8 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | chrome/browser/safe_browsing/prefix_set_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 #include "chrome/browser/safe_browsing/prefix_set.h" 5 #include "chrome/browser/safe_browsing/prefix_set.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <math.h> 8 #include <math.h>
9 9
10 #include "base/file_util.h" 10 #include "base/file_util.h"
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
186 186
187 // The file looks valid, start building the digest. 187 // The file looks valid, start building the digest.
188 base::MD5Context context; 188 base::MD5Context context;
189 base::MD5Init(&context); 189 base::MD5Init(&context);
190 base::MD5Update(&context, base::StringPiece(reinterpret_cast<char*>(&header), 190 base::MD5Update(&context, base::StringPiece(reinterpret_cast<char*>(&header),
191 sizeof(header))); 191 sizeof(header)));
192 192
193 // Read the index vector. Herb Sutter indicates that vectors are 193 // Read the index vector. Herb Sutter indicates that vectors are
194 // guaranteed to be contiuguous, so reading to where element 0 lives 194 // guaranteed to be contiuguous, so reading to where element 0 lives
195 // is valid. 195 // is valid.
196 index.resize(header.index_size); 196 if (header.index_size) {
197 read = fread(&(index[0]), sizeof(index[0]), index.size(), file.get()); 197 index.resize(header.index_size);
198 if (read != index.size()) 198 read = fread(&(index[0]), sizeof(index[0]), index.size(), file.get());
199 return NULL; 199 if (read != index.size())
200 base::MD5Update(&context, 200 return NULL;
201 base::StringPiece(reinterpret_cast<char*>(&(index[0])), 201 base::MD5Update(&context,
202 index_bytes)); 202 base::StringPiece(reinterpret_cast<char*>(&(index[0])),
203 index_bytes));
204 }
203 205
204 // Read vector of deltas. 206 // Read vector of deltas.
205 deltas.resize(header.deltas_size); 207 if (header.deltas_size) {
206 read = fread(&(deltas[0]), sizeof(deltas[0]), deltas.size(), file.get()); 208 deltas.resize(header.deltas_size);
207 if (read != deltas.size()) 209 read = fread(&(deltas[0]), sizeof(deltas[0]), deltas.size(), file.get());
208 return NULL; 210 if (read != deltas.size())
209 base::MD5Update(&context, 211 return NULL;
210 base::StringPiece(reinterpret_cast<char*>(&(deltas[0])), 212 base::MD5Update(&context,
211 deltas_bytes)); 213 base::StringPiece(reinterpret_cast<char*>(&(deltas[0])),
214 deltas_bytes));
215 }
212 216
213 base::MD5Digest calculated_digest; 217 base::MD5Digest calculated_digest;
214 base::MD5Final(&calculated_digest, &context); 218 base::MD5Final(&calculated_digest, &context);
215 219
216 base::MD5Digest file_digest; 220 base::MD5Digest file_digest;
217 read = fread(&file_digest, sizeof(file_digest), 1, file.get()); 221 read = fread(&file_digest, sizeof(file_digest), 1, file.get());
218 if (read != 1) 222 if (read != 1)
219 return NULL; 223 return NULL;
220 224
221 if (0 != memcmp(&file_digest, &calculated_digest, sizeof(file_digest))) 225 if (0 != memcmp(&file_digest, &calculated_digest, sizeof(file_digest)))
(...skipping 27 matching lines...) Expand all
249 // TODO(shess): The I/O code in safe_browsing_store_file.cc would 253 // TODO(shess): The I/O code in safe_browsing_store_file.cc would
250 // sure be useful about now. 254 // sure be useful about now.
251 size_t written = fwrite(&header, sizeof(header), 1, file.get()); 255 size_t written = fwrite(&header, sizeof(header), 1, file.get());
252 if (written != 1) 256 if (written != 1)
253 return false; 257 return false;
254 base::MD5Update(&context, base::StringPiece(reinterpret_cast<char*>(&header), 258 base::MD5Update(&context, base::StringPiece(reinterpret_cast<char*>(&header),
255 sizeof(header))); 259 sizeof(header)));
256 260
257 // As for reads, the standard guarantees the ability to access the 261 // As for reads, the standard guarantees the ability to access the
258 // contents of the vector by a pointer to an element. 262 // contents of the vector by a pointer to an element.
259 const size_t index_bytes = sizeof(index_[0]) * index_.size(); 263 if (index_.size()) {
260 written = fwrite(&(index_[0]), sizeof(index_[0]), index_.size(), file.get()); 264 const size_t index_bytes = sizeof(index_[0]) * index_.size();
261 if (written != index_.size()) 265 written = fwrite(&(index_[0]), sizeof(index_[0]), index_.size(),
262 return false; 266 file.get());
263 base::MD5Update(&context, 267 if (written != index_.size())
264 base::StringPiece(reinterpret_cast<const char*>(&(index_[0])), 268 return false;
265 index_bytes)); 269 base::MD5Update(&context,
270 base::StringPiece(
271 reinterpret_cast<const char*>(&(index_[0])),
272 index_bytes));
273 }
266 274
267 const size_t deltas_bytes = sizeof(deltas_[0]) * deltas_.size(); 275 if (deltas_.size()) {
268 written = fwrite(&(deltas_[0]), sizeof(deltas_[0]), deltas_.size(), 276 const size_t deltas_bytes = sizeof(deltas_[0]) * deltas_.size();
269 file.get()); 277 written = fwrite(&(deltas_[0]), sizeof(deltas_[0]), deltas_.size(),
270 if (written != deltas_.size()) 278 file.get());
271 return false; 279 if (written != deltas_.size())
272 base::MD5Update(&context, 280 return false;
273 base::StringPiece( 281 base::MD5Update(&context,
274 reinterpret_cast<const char*>(&(deltas_[0])), 282 base::StringPiece(
275 deltas_bytes)); 283 reinterpret_cast<const char*>(&(deltas_[0])),
284 deltas_bytes));
285 }
276 286
277 base::MD5Digest digest; 287 base::MD5Digest digest;
278 base::MD5Final(&digest, &context); 288 base::MD5Final(&digest, &context);
279 written = fwrite(&digest, sizeof(digest), 1, file.get()); 289 written = fwrite(&digest, sizeof(digest), 1, file.get());
280 if (written != 1) 290 if (written != 1)
281 return false; 291 return false;
282 292
283 // TODO(shess): Can this code check that the close was successful? 293 // TODO(shess): Can this code check that the close was successful?
284 file.reset(); 294 file.reset();
285 295
286 return true; 296 return true;
287 } 297 }
288 298
289 } // namespace safe_browsing 299 } // namespace safe_browsing
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/safe_browsing/prefix_set_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698