| Index: chrome/browser/sync/engine/syncapi.cc
|
| diff --git a/chrome/browser/sync/engine/syncapi.cc b/chrome/browser/sync/engine/syncapi.cc
|
| index 360b6947b8346a074646d9eb7374e070c9eacba7..5f60488744a90ce599d0b61c6c60d9ee23e38b45 100644
|
| --- a/chrome/browser/sync/engine/syncapi.cc
|
| +++ b/chrome/browser/sync/engine/syncapi.cc
|
| @@ -202,7 +202,7 @@ UserShare::~UserShare() {}
|
| ////////////////////////////////////
|
| // BaseNode member definitions.
|
|
|
| -BaseNode::BaseNode() {}
|
| +BaseNode::BaseNode() : password_data_(new sync_pb::PasswordSpecificsData) {}
|
|
|
| BaseNode::~BaseNode() {}
|
|
|
| @@ -245,8 +245,10 @@ bool BaseNode::DecryptIfNecessary() {
|
| // Passwords have their own legacy encryption structure.
|
| scoped_ptr<sync_pb::PasswordSpecificsData> data(DecryptPasswordSpecifics(
|
| specifics, GetTransaction()->GetCryptographer()));
|
| - if (!data.get())
|
| + if (!data.get()) {
|
| + LOG(ERROR) << "Failed to decrypt password specifics.";
|
| return false;
|
| + }
|
| password_data_.swap(data);
|
| return true;
|
| }
|
| @@ -259,9 +261,8 @@ bool BaseNode::DecryptIfNecessary() {
|
| specifics.encrypted();
|
| std::string plaintext_data = GetTransaction()->GetCryptographer()->
|
| DecryptToString(encrypted);
|
| - if (plaintext_data.length() == 0)
|
| - return false;
|
| - if (!unencrypted_data_.ParseFromString(plaintext_data)) {
|
| + if (plaintext_data.length() == 0 ||
|
| + !unencrypted_data_.ParseFromString(plaintext_data)) {
|
| LOG(ERROR) << "Failed to decrypt encrypted node of type " <<
|
| syncable::ModelTypeToString(GetModelType()) << ".";
|
| return false;
|
| @@ -404,7 +405,6 @@ const sync_pb::NigoriSpecifics& BaseNode::GetNigoriSpecifics() const {
|
|
|
| const sync_pb::PasswordSpecificsData& BaseNode::GetPasswordSpecifics() const {
|
| DCHECK_EQ(syncable::PASSWORDS, GetModelType());
|
| - DCHECK(password_data_.get());
|
| return *password_data_;
|
| }
|
|
|
| @@ -571,7 +571,9 @@ void WriteNode::SetPasswordSpecifics(
|
|
|
| sync_pb::PasswordSpecifics new_value;
|
| if (!cryptographer->Encrypt(data, new_value.mutable_encrypted())) {
|
| - NOTREACHED();
|
| + LOG(ERROR) << "Failed to encrypt password, possibly due to sync node "
|
| + << "corruption";
|
| + return;
|
| }
|
|
|
| sync_pb::EntitySpecifics entity_specifics;
|
| @@ -1829,14 +1831,18 @@ void SyncManager::SyncInternal::BootstrapEncryption(
|
| CopyObservers(&temp_obs_list);
|
| FOR_EACH_OBSERVER(SyncManager::Observer, temp_obs_list,
|
| OnPassphraseRequired(sync_api::REASON_DECRYPTION));
|
| + return;
|
| + }
|
| +
|
| + if (!cryptographer->is_ready()) {
|
| + NOTREACHED() << "Cryptographer failed to initialize.";
|
| + return;
|
| }
|
|
|
| // Refresh list of encrypted datatypes.
|
| encrypted_types = GetEncryptedTypes(&trans);
|
| }
|
|
|
| -
|
| -
|
| // Ensure any datatypes that need encryption are encrypted.
|
| EncryptDataTypes(encrypted_types);
|
| }
|
| @@ -2085,14 +2091,19 @@ void SyncManager::SyncInternal::EncryptDataTypes(
|
| WriteTransaction trans(GetUserShare());
|
| WriteNode node(&trans);
|
| if (!node.InitByTagLookup(kNigoriTag)) {
|
| - LOG(ERROR) << "Unable to set encrypted datatypes because Nigori node not "
|
| - << "found.";
|
| - NOTREACHED();
|
| + NOTREACHED() << "Unable to set encrypted datatypes because Nigori node not "
|
| + << "found.";
|
| return;
|
| }
|
|
|
| Cryptographer* cryptographer = trans.GetCryptographer();
|
|
|
| + if (!cryptographer->is_ready()) {
|
| + NOTREACHED() << "Attempting to encrypt datatypes when cryptographer not "
|
| + << "ready.";
|
| + return;
|
| + }
|
| +
|
| // Update the Nigori node set of encrypted datatypes so other machines notice.
|
| // Note, we merge the current encrypted types with those requested. Once a
|
| // datatypes is marked as needing encryption, it is never unmarked.
|
|
|