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 |