diff options
Diffstat (limited to 'chromium/build/patches/chromium_kde_pickles.patch')
-rw-r--r-- | chromium/build/patches/chromium_kde_pickles.patch | 251 |
1 files changed, 251 insertions, 0 deletions
diff --git a/chromium/build/patches/chromium_kde_pickles.patch b/chromium/build/patches/chromium_kde_pickles.patch new file mode 100644 index 00000000..0b3b1e55 --- /dev/null +++ b/chromium/build/patches/chromium_kde_pickles.patch @@ -0,0 +1,251 @@ +[Password manager] Fix pickle creatin for KDE, bump to version 7 + +As described in http://crbug.com/494229#c11, version 6 pickles have been stored without generation_upload_status recently. This extends the definition of version 6 pickle to have this field optional. + +This CL introduces version 7 which makes that field required, and adds graceful handling of version 6. + +BUG=494229 + +Review URL: https://codereview.chromium.org/1181203003 + +Cr-Commit-Position: refs/heads/master@{#334561} +diff --git a/chrome/browser/password_manager/native_backend_kwallet_x.cc b/chrome/browser/password_manager/native_backend_kwallet_x.cc +index 12536ed..78aa1d9 100644 +--- a/chrome/browser/password_manager/native_backend_kwallet_x.cc ++++ b/chrome/browser/password_manager/native_backend_kwallet_x.cc +@@ -30,7 +30,7 @@ + + // In case the fields in the pickle ever change, version them so we can try to + // read old pickles. (Note: do not eat old pickles past the expiration date.) +-const int kPickleVersion = 6; ++const int kPickleVersion = 7; + + // We could localize this string, but then changing your locale would cause + // you to lose access to all your stored passwords. Maybe best not to do that. +@@ -218,12 +218,18 @@ + } + + if (version > 5) { +- if (!iter.ReadInt(&generation_upload_status)) { ++ bool read_success = iter.ReadInt(&generation_upload_status); ++ if (!read_success && version > 6) { ++ // Valid version 6 pickles might still lack the ++ // generation_upload_status, see http://crbug.com/494229#c11. + LogDeserializationWarning(version, signon_realm, false); ++ return false; + } +- form->generation_upload_status = +- static_cast<PasswordForm::GenerationUploadStatus>( +- generation_upload_status); ++ if (read_success) { ++ form->generation_upload_status = ++ static_cast<PasswordForm::GenerationUploadStatus>( ++ generation_upload_status); ++ } + } + + converted_forms.push_back(form.Pass()); +@@ -259,6 +265,7 @@ + pickle->WriteString(form->avatar_url.spec()); + pickle->WriteString(form->federation_url.spec()); + pickle->WriteBool(form->skip_zero_click); ++ pickle->WriteInt(form->generation_upload_status); + } + } + +diff --git a/chrome/browser/password_manager/native_backend_kwallet_x_unittest.cc b/chrome/browser/password_manager/native_backend_kwallet_x_unittest.cc +index 670cf41..b1a9524 100644 +--- a/chrome/browser/password_manager/native_backend_kwallet_x_unittest.cc ++++ b/chrome/browser/password_manager/native_backend_kwallet_x_unittest.cc +@@ -173,6 +173,7 @@ + form_google_.avatar_url = GURL("http://www.google.com/avatar"); + form_google_.federation_url = GURL("http://www.google.com/federation_url"); + form_google_.skip_zero_click = true; ++ form_google_.generation_upload_status = PasswordForm::NEGATIVE_SIGNAL_SENT; + + form_isc_.origin = GURL("http://www.isc.org/"); + form_isc_.action = GURL("http://www.isc.org/auth"); +@@ -934,15 +935,21 @@ + + class NativeBackendKWalletPickleTest : public NativeBackendKWalletTestBase { + protected: +- void CreateVersion6Pickle(const PasswordForm& form, base::Pickle* pickle); +- void CreateVersion5Pickle(const PasswordForm& form, base::Pickle* pickle); +- void CreateVersion3Pickle(const PasswordForm& form, base::Pickle* pickle); +- void CreateVersion2Pickle(const PasswordForm& form, base::Pickle* pickle); +- void CreateVersion1Pickle(const PasswordForm& form, base::Pickle* pickle); ++ // Based on |form|, fills |pickle| with data conforming to ++ // |effective_version|, but marking the pickle version as |stored_version|. In ++ // most cases the two versions should be the same. ++ void CreateVersion1PlusPickle(const PasswordForm& form, ++ base::Pickle* pickle, ++ int stored_version, ++ int effective_version); + void CreateVersion0Pickle(bool size_32, + const PasswordForm& form, + base::Pickle* pickle); +- void CheckVersion6Pickle(); ++ // As explained in http://crbug.com/494229#c11, version 6 added a new optional ++ // field to version 5. This field became required in version 7. Depending on ++ // |with_optional_field|, this method checks deserialization with or without ++ // the optional field. ++ void CheckVersion6Pickle(bool with_optional_field); + void CheckVersion5Pickle(); + void CheckVersion3Pickle(); + void CheckVersion2Pickle(); +@@ -960,63 +967,30 @@ + base::Pickle* pickle); + }; + +-void NativeBackendKWalletPickleTest::CreateVersion6Pickle( ++void NativeBackendKWalletPickleTest::CreateVersion1PlusPickle( + const PasswordForm& form, +- base::Pickle* pickle) { +- pickle->WriteInt(6); ++ base::Pickle* pickle, ++ int stored_version, ++ int effective_version) { ++ pickle->WriteInt(stored_version); + CreatePickle(false, true, form, pickle); ++ if (effective_version < 2) ++ return; + pickle->WriteInt(form.type); + pickle->WriteInt(form.times_used); + autofill::SerializeFormData(form.form_data, pickle); ++ if (effective_version < 3) ++ return; + pickle->WriteInt64(form.date_synced.ToInternalValue()); ++ if (effective_version < 4) ++ return; + pickle->WriteString16(form.display_name); + pickle->WriteString(form.avatar_url.spec()); + pickle->WriteString(form.federation_url.spec()); + pickle->WriteBool(form.skip_zero_click); ++ if (effective_version < 7) ++ return; + pickle->WriteInt(form.generation_upload_status); +-} +- +-void NativeBackendKWalletPickleTest::CreateVersion5Pickle( +- const PasswordForm& form, +- base::Pickle* pickle) { +- pickle->WriteInt(5); +- CreatePickle(false, true, form, pickle); +- pickle->WriteInt(form.type); +- pickle->WriteInt(form.times_used); +- autofill::SerializeFormData(form.form_data, pickle); +- pickle->WriteInt64(form.date_synced.ToInternalValue()); +- pickle->WriteString16(form.display_name); +- pickle->WriteString(form.avatar_url.spec()); +- pickle->WriteString(form.federation_url.spec()); +- pickle->WriteBool(form.skip_zero_click); +-} +- +-void NativeBackendKWalletPickleTest::CreateVersion3Pickle( +- const PasswordForm& form, +- base::Pickle* pickle) { +- pickle->WriteInt(3); +- CreatePickle(false, false, form, pickle); +- pickle->WriteInt(form.type); +- pickle->WriteInt(form.times_used); +- autofill::SerializeFormData(form.form_data, pickle); +- pickle->WriteInt64(form.date_synced.ToInternalValue()); +-} +- +-void NativeBackendKWalletPickleTest::CreateVersion2Pickle( +- const PasswordForm& form, +- base::Pickle* pickle) { +- pickle->WriteInt(2); +- CreatePickle(false, false, form, pickle); +- pickle->WriteInt(form.type); +- pickle->WriteInt(form.times_used); +- autofill::SerializeFormData(form.form_data, pickle); +-} +- +-void NativeBackendKWalletPickleTest::CreateVersion1Pickle( +- const PasswordForm& form, +- base::Pickle* pickle) { +- pickle->WriteInt(1); +- CreatePickle(false, false, form, pickle); + } + + void NativeBackendKWalletPickleTest::CreateVersion0Pickle( +@@ -1052,11 +1026,15 @@ + pickle->WriteInt64(form.date_created.ToTimeT()); + } + +-void NativeBackendKWalletPickleTest::CheckVersion6Pickle() { ++void NativeBackendKWalletPickleTest::CheckVersion6Pickle( ++ bool with_optional_field) { + base::Pickle pickle; + PasswordForm form = form_google_; +- form.generation_upload_status = PasswordForm::NEGATIVE_SIGNAL_SENT; +- CreateVersion6Pickle(form, &pickle); ++ if (!with_optional_field) { ++ PasswordForm default_values; ++ form.generation_upload_status = default_values.generation_upload_status; ++ } ++ CreateVersion1PlusPickle(form, &pickle, 6, with_optional_field ? 7 : 5); + + ScopedVector<PasswordForm> form_list = + NativeBackendKWalletStub::DeserializeValue(form.signon_realm, pickle); +@@ -1069,8 +1047,11 @@ + + void NativeBackendKWalletPickleTest::CheckVersion5Pickle() { + base::Pickle pickle; ++ PasswordForm default_values; + PasswordForm form = form_google_; +- CreateVersion5Pickle(form, &pickle); ++ // Remove the field which was not present in version #5. ++ form.generation_upload_status = default_values.generation_upload_status; ++ CreateVersion1PlusPickle(form, &pickle, 5, 5); + + ScopedVector<PasswordForm> form_list = + NativeBackendKWalletStub::DeserializeValue(form.signon_realm, pickle); +@@ -1082,13 +1063,15 @@ + + void NativeBackendKWalletPickleTest::CheckVersion3Pickle() { + base::Pickle pickle; ++ PasswordForm default_values; + PasswordForm form = form_google_; + // Remove the fields which were not present in version #3. +- form.display_name.clear(); +- form.avatar_url = GURL(); +- form.federation_url = GURL(); +- form.skip_zero_click = false; +- CreateVersion3Pickle(form, &pickle); ++ form.display_name = default_values.display_name; ++ form.avatar_url = default_values.avatar_url; ++ form.federation_url = default_values.federation_url; ++ form.skip_zero_click = default_values.skip_zero_click; ++ form.generation_upload_status = default_values.generation_upload_status; ++ CreateVersion1PlusPickle(form, &pickle, 3, 3); + + ScopedVector<PasswordForm> form_list = + NativeBackendKWalletStub::DeserializeValue(form.signon_realm, pickle); +@@ -1104,7 +1087,7 @@ + form.times_used = form_google_.times_used; + form.type = form_google_.type; + form.form_data = form_google_.form_data; +- CreateVersion2Pickle(form, &pickle); ++ CreateVersion1PlusPickle(form, &pickle, 2, 2); + + ScopedVector<PasswordForm> form_list = + NativeBackendKWalletStub::DeserializeValue(form.signon_realm, pickle); +@@ -1118,7 +1101,7 @@ + void NativeBackendKWalletPickleTest::CheckVersion1Pickle() { + base::Pickle pickle; + PasswordForm form = form_google_; +- CreateVersion1Pickle(form, &pickle); ++ CreateVersion1PlusPickle(form, &pickle, 1, 1); + + ScopedVector<autofill::PasswordForm> form_list = + NativeBackendKWalletStub::DeserializeValue(form.signon_realm, pickle); +@@ -1206,5 +1189,6 @@ + } + + TEST_F(NativeBackendKWalletPickleTest, CheckVersion6Pickle) { +- CheckVersion6Pickle(); ++ CheckVersion6Pickle(false); ++ CheckVersion6Pickle(true); + } |