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 |