| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |