Chromium Code Reviews| Index: sync/internal_api/attachments/on_disk_attachment_store.cc |
| diff --git a/sync/internal_api/attachments/on_disk_attachment_store.cc b/sync/internal_api/attachments/on_disk_attachment_store.cc |
| index 25ad18672ffe99942136a534b7e64bd246955ca3..0af371b130391057edeb6c613c834bb96f922d48 100644 |
| --- a/sync/internal_api/attachments/on_disk_attachment_store.cc |
| +++ b/sync/internal_api/attachments/on_disk_attachment_store.cc |
| @@ -10,6 +10,7 @@ |
| #include "base/memory/scoped_ptr.h" |
| #include "base/sequenced_task_runner.h" |
| #include "sync/internal_api/attachments/proto/attachment_store.pb.h" |
| +#include "sync/internal_api/public/attachments/attachment_util.h" |
| #include "sync/protocol/attachments.pb.h" |
| #include "third_party/leveldatabase/src/include/leveldb/db.h" |
| #include "third_party/leveldatabase/src/include/leveldb/options.h" |
| @@ -211,16 +212,35 @@ scoped_ptr<Attachment> OnDiskAttachmentStore::ReadSingleAttachment( |
| scoped_ptr<Attachment> attachment; |
| const std::string key = MakeDataKeyFromAttachmentId(attachment_id); |
| + const std::string metadata_key = |
| + MakeMetadataKeyFromAttachmentId(attachment_id); |
| + leveldb::Status status; |
| + std::string metadata_str; |
| + status = db_->Get(MakeMetadataReadOptions(), metadata_key, &metadata_str); |
| + if (!status.ok()) { |
| + DVLOG(1) << "DB::Get for metadata failed: status=" << status.ToString(); |
| + return attachment.Pass(); |
| + } |
| + attachment_store_pb::RecordMetadata record_metadata; |
| + if (!record_metadata.ParseFromString(metadata_str)) { |
| + DVLOG(1) << "RecordMetadata::ParseFromString failed"; |
| + return attachment.Pass(); |
| + } |
| std::string data_str; |
| - leveldb::Status status = db_->Get(MakeDataReadOptions(), key, &data_str); |
| - if (status.ok()) { |
| - scoped_refptr<base::RefCountedMemory> data = |
| - base::RefCountedString::TakeString(&data_str); |
| - attachment.reset( |
| - new Attachment(Attachment::CreateWithId(attachment_id, data))); |
| - } else { |
| - DVLOG(1) << "DB::Get failed: status=" << status.ToString(); |
| + status = db_->Get(MakeDataReadOptions(), key, &data_str); |
| + if (!status.ok()) { |
| + DVLOG(1) << "DB::Get for data failed: status=" << status.ToString(); |
| + return attachment.Pass(); |
| + } |
| + scoped_refptr<base::RefCountedMemory> data = |
| + base::RefCountedString::TakeString(&data_str); |
| + uint32_t crc = ComputeCrc32c(data); |
|
maniscalco
2014/11/11 00:44:54
crc -> crc32c
pavely
2014/11/11 22:27:15
Done.
|
| + if (record_metadata.has_crc32c() && record_metadata.crc32c() != crc) { |
| + DVLOG(1) << "Attachment crc does not match"; |
| + return attachment.Pass(); |
| } |
| + attachment.reset( |
| + new Attachment(Attachment::RestoreExisting(attachment_id, data, crc))); |
| return attachment.Pass(); |
| } |
| @@ -247,6 +267,7 @@ bool OnDiskAttachmentStore::WriteSingleAttachment( |
| // Write metadata. |
| attachment_store_pb::RecordMetadata metadata; |
| metadata.set_attachment_size(attachment.GetData()->size()); |
| + metadata.set_crc32c(attachment.GetCrc32c()); |
| metadata_str = metadata.SerializeAsString(); |
| write_batch.Put(metadata_key, metadata_str); |
| // Write data. |