| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 185 | 185 |
| 186 // Check for bogus sizes before allocating any space. | 186 // Check for bogus sizes before allocating any space. |
| 187 const size_t expected_bytes = | 187 const size_t expected_bytes = |
| 188 sizeof(header) + index_bytes + deltas_bytes + sizeof(MD5Digest); | 188 sizeof(header) + index_bytes + deltas_bytes + sizeof(MD5Digest); |
| 189 if (static_cast<int64>(expected_bytes) != size_64) | 189 if (static_cast<int64>(expected_bytes) != size_64) |
| 190 return NULL; | 190 return NULL; |
| 191 | 191 |
| 192 // The file looks valid, start building the digest. | 192 // The file looks valid, start building the digest. |
| 193 base::MD5Context context; | 193 base::MD5Context context; |
| 194 base::MD5Init(&context); | 194 base::MD5Init(&context); |
| 195 base::MD5Update(&context, &header, sizeof(header)); | 195 base::MD5Update(&context, base::StringPiece(reinterpret_cast<char*>(&header), |
| 196 sizeof(header))); |
| 196 | 197 |
| 197 // Read the index vector. Herb Sutter indicates that vectors are | 198 // Read the index vector. Herb Sutter indicates that vectors are |
| 198 // guaranteed to be contiuguous, so reading to where element 0 lives | 199 // guaranteed to be contiuguous, so reading to where element 0 lives |
| 199 // is valid. | 200 // is valid. |
| 200 index.resize(header.index_size); | 201 index.resize(header.index_size); |
| 201 read = fread(&(index[0]), sizeof(index[0]), index.size(), file.get()); | 202 read = fread(&(index[0]), sizeof(index[0]), index.size(), file.get()); |
| 202 if (read != index.size()) | 203 if (read != index.size()) |
| 203 return NULL; | 204 return NULL; |
| 204 base::MD5Update(&context, &(index[0]), index_bytes); | 205 base::MD5Update(&context, |
| 206 base::StringPiece(reinterpret_cast<char*>(&(index[0])), |
| 207 index_bytes)); |
| 205 | 208 |
| 206 // Read vector of deltas. | 209 // Read vector of deltas. |
| 207 deltas.resize(header.deltas_size); | 210 deltas.resize(header.deltas_size); |
| 208 read = fread(&(deltas[0]), sizeof(deltas[0]), deltas.size(), file.get()); | 211 read = fread(&(deltas[0]), sizeof(deltas[0]), deltas.size(), file.get()); |
| 209 if (read != deltas.size()) | 212 if (read != deltas.size()) |
| 210 return NULL; | 213 return NULL; |
| 211 base::MD5Update(&context, &(deltas[0]), deltas_bytes); | 214 base::MD5Update(&context, |
| 215 base::StringPiece(reinterpret_cast<char*>(&(deltas[0])), |
| 216 deltas_bytes)); |
| 212 | 217 |
| 213 base::MD5Digest calculated_digest; | 218 base::MD5Digest calculated_digest; |
| 214 base::MD5Final(&calculated_digest, &context); | 219 base::MD5Final(&calculated_digest, &context); |
| 215 | 220 |
| 216 base::MD5Digest file_digest; | 221 base::MD5Digest file_digest; |
| 217 read = fread(&file_digest, sizeof(file_digest), 1, file.get()); | 222 read = fread(&file_digest, sizeof(file_digest), 1, file.get()); |
| 218 if (read != 1) | 223 if (read != 1) |
| 219 return NULL; | 224 return NULL; |
| 220 | 225 |
| 221 if (0 != memcmp(&file_digest, &calculated_digest, sizeof(file_digest))) | 226 if (0 != memcmp(&file_digest, &calculated_digest, sizeof(file_digest))) |
| (...skipping 22 matching lines...) Expand all Loading... |
| 244 return false; | 249 return false; |
| 245 | 250 |
| 246 base::MD5Context context; | 251 base::MD5Context context; |
| 247 base::MD5Init(&context); | 252 base::MD5Init(&context); |
| 248 | 253 |
| 249 // TODO(shess): The I/O code in safe_browsing_store_file.cc would | 254 // TODO(shess): The I/O code in safe_browsing_store_file.cc would |
| 250 // sure be useful about now. | 255 // sure be useful about now. |
| 251 size_t written = fwrite(&header, sizeof(header), 1, file.get()); | 256 size_t written = fwrite(&header, sizeof(header), 1, file.get()); |
| 252 if (written != 1) | 257 if (written != 1) |
| 253 return false; | 258 return false; |
| 254 base::MD5Update(&context, &header, sizeof(header)); | 259 base::MD5Update(&context, base::StringPiece(reinterpret_cast<char*>(&header), |
| 260 sizeof(header))); |
| 255 | 261 |
| 256 // As for reads, the standard guarantees the ability to access the | 262 // As for reads, the standard guarantees the ability to access the |
| 257 // contents of the vector by a pointer to an element. | 263 // contents of the vector by a pointer to an element. |
| 258 const size_t index_bytes = sizeof(index_[0]) * index_.size(); | 264 const size_t index_bytes = sizeof(index_[0]) * index_.size(); |
| 259 written = fwrite(&(index_[0]), sizeof(index_[0]), index_.size(), file.get()); | 265 written = fwrite(&(index_[0]), sizeof(index_[0]), index_.size(), file.get()); |
| 260 if (written != index_.size()) | 266 if (written != index_.size()) |
| 261 return false; | 267 return false; |
| 262 base::MD5Update(&context, &(index_[0]), index_bytes); | 268 base::MD5Update(&context, |
| 269 base::StringPiece(reinterpret_cast<const char*>(&(index_[0])), |
| 270 index_bytes)); |
| 263 | 271 |
| 264 const size_t deltas_bytes = sizeof(deltas_[0]) * deltas_.size(); | 272 const size_t deltas_bytes = sizeof(deltas_[0]) * deltas_.size(); |
| 265 written = fwrite(&(deltas_[0]), sizeof(deltas_[0]), deltas_.size(), | 273 written = fwrite(&(deltas_[0]), sizeof(deltas_[0]), deltas_.size(), |
| 266 file.get()); | 274 file.get()); |
| 267 if (written != deltas_.size()) | 275 if (written != deltas_.size()) |
| 268 return false; | 276 return false; |
| 269 base::MD5Update(&context, &(deltas_[0]), deltas_bytes); | 277 base::MD5Update(&context, |
| 278 base::StringPiece( |
| 279 reinterpret_cast<const char*>(&(deltas_[0])), |
| 280 deltas_bytes)); |
| 270 | 281 |
| 271 base::MD5Digest digest; | 282 base::MD5Digest digest; |
| 272 base::MD5Final(&digest, &context); | 283 base::MD5Final(&digest, &context); |
| 273 written = fwrite(&digest, sizeof(digest), 1, file.get()); | 284 written = fwrite(&digest, sizeof(digest), 1, file.get()); |
| 274 if (written != 1) | 285 if (written != 1) |
| 275 return false; | 286 return false; |
| 276 | 287 |
| 277 // TODO(shess): Can this code check that the close was successful? | 288 // TODO(shess): Can this code check that the close was successful? |
| 278 file.reset(); | 289 file.reset(); |
| 279 | 290 |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 340 } | 351 } |
| 341 | 352 |
| 342 for (size_t di = 0; di < deltas_.size(); ++di) { | 353 for (size_t di = 0; di < deltas_.size(); ++di) { |
| 343 checksum ^= static_cast<uint32>(deltas_[di]); | 354 checksum ^= static_cast<uint32>(deltas_[di]); |
| 344 } | 355 } |
| 345 | 356 |
| 346 return checksum == checksum_; | 357 return checksum == checksum_; |
| 347 } | 358 } |
| 348 | 359 |
| 349 } // namespace safe_browsing | 360 } // namespace safe_browsing |
| OLD | NEW |