diff options
author | dhollowa@chromium.org <dhollowa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-04-27 00:22:23 +0000 |
---|---|---|
committer | dhollowa@chromium.org <dhollowa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-04-27 00:22:23 +0000 |
commit | aa382fee25074e025294ae8e312360965d47e2e4 (patch) | |
tree | 252968511606328d0673dd7e813a341b9e023070 /chrome/browser/webdata | |
parent | 77700831c1d0a328a5fada182adfab6dd86d937e (diff) | |
download | chromium_src-aa382fee25074e025294ae8e312360965d47e2e4.zip chromium_src-aa382fee25074e025294ae8e312360965d47e2e4.tar.gz chromium_src-aa382fee25074e025294ae8e312360965d47e2e4.tar.bz2 |
AutoFill crash in CreditCard::SetInfo().
Fix for crash seen in the field. The AutoFillType class was not thread-safe. These changes
make it so. Also adds unit tests that cover mappings from type to group and subgroup, and
out of range conditions.
BUG=42341
TEST=AutoFillTypeTest
Review URL: http://codereview.chromium.org/1789001
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@45650 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/webdata')
-rw-r--r-- | chrome/browser/webdata/web_database.cc | 81 | ||||
-rw-r--r-- | chrome/browser/webdata/web_database.h | 26 |
2 files changed, 55 insertions, 52 deletions
diff --git a/chrome/browser/webdata/web_database.cc b/chrome/browser/webdata/web_database.cc index e3ba7dc..70cdd74 100644 --- a/chrome/browser/webdata/web_database.cc +++ b/chrome/browser/webdata/web_database.cc @@ -1549,37 +1549,37 @@ bool WebDatabase::GetAutoFillProfileForID(int profile_id, return s.Succeeded(); } -static void BindCreditCardToStatement(const CreditCard& creditcard, +static void BindCreditCardToStatement(const CreditCard& credit_card, sql::Statement* s) { - s->BindString(0, UTF16ToUTF8(creditcard.Label())); - s->BindInt(1, creditcard.unique_id()); + s->BindString(0, UTF16ToUTF8(credit_card.Label())); + s->BindInt(1, credit_card.unique_id()); - string16 text = creditcard.GetFieldText(AutoFillType(CREDIT_CARD_NAME)); + string16 text = credit_card.GetFieldText(AutoFillType(CREDIT_CARD_NAME)); s->BindString(2, UTF16ToUTF8(text)); - text = creditcard.GetFieldText(AutoFillType(CREDIT_CARD_TYPE)); + text = credit_card.GetFieldText(AutoFillType(CREDIT_CARD_TYPE)); s->BindString(3, UTF16ToUTF8(text)); text.clear(); // No unencrypted cc info. s->BindString(4, UTF16ToUTF8(text)); - text = creditcard.GetFieldText(AutoFillType(CREDIT_CARD_EXP_MONTH)); + text = credit_card.GetFieldText(AutoFillType(CREDIT_CARD_EXP_MONTH)); s->BindString(5, UTF16ToUTF8(text)); - text = creditcard.GetFieldText(AutoFillType(CREDIT_CARD_EXP_4_DIGIT_YEAR)); + text = credit_card.GetFieldText(AutoFillType(CREDIT_CARD_EXP_4_DIGIT_YEAR)); s->BindString(6, UTF16ToUTF8(text)); text.clear(); s->BindString(7, UTF16ToUTF8(text)); - s->BindString(8, UTF16ToUTF8(creditcard.billing_address())); - s->BindString(9, UTF16ToUTF8(creditcard.shipping_address())); - text = creditcard.GetFieldText(AutoFillType(CREDIT_CARD_NUMBER)); + s->BindString(8, UTF16ToUTF8(credit_card.billing_address())); + s->BindString(9, UTF16ToUTF8(credit_card.shipping_address())); + text = credit_card.GetFieldText(AutoFillType(CREDIT_CARD_NUMBER)); std::string encrypted_data; Encryptor::EncryptString16(text, &encrypted_data); s->BindBlob(10, encrypted_data.data(), static_cast<int>(encrypted_data.length())); - text = creditcard.GetFieldText(AutoFillType(CREDIT_CARD_VERIFICATION_CODE)); + text = credit_card.GetFieldText(AutoFillType(CREDIT_CARD_VERIFICATION_CODE)); Encryptor::EncryptString16(text, &encrypted_data); s->BindBlob(11, encrypted_data.data(), static_cast<int>(encrypted_data.length())); } -bool WebDatabase::AddCreditCard(const CreditCard& creditcard) { +bool WebDatabase::AddCreditCard(const CreditCard& credit_card) { sql::Statement s(db_.GetUniqueStatement( "INSERT INTO credit_cards" "(label, unique_id, name_on_card, type, card_number," @@ -1591,7 +1591,7 @@ bool WebDatabase::AddCreditCard(const CreditCard& creditcard) { return false; } - BindCreditCardToStatement(creditcard, &s); + BindCreditCardToStatement(credit_card, &s); if (!s.Run()) { NOTREACHED(); @@ -1603,11 +1603,11 @@ bool WebDatabase::AddCreditCard(const CreditCard& creditcard) { } static CreditCard* CreditCardFromStatement(const sql::Statement& s) { - CreditCard* creditcard = new CreditCard( + CreditCard* credit_card = new CreditCard( UTF8ToUTF16(s.ColumnString(0)), s.ColumnInt(1)); - creditcard->SetInfo(AutoFillType(CREDIT_CARD_NAME), + credit_card->SetInfo(AutoFillType(CREDIT_CARD_NAME), UTF8ToUTF16(s.ColumnString(2))); - creditcard->SetInfo(AutoFillType(CREDIT_CARD_TYPE), + credit_card->SetInfo(AutoFillType(CREDIT_CARD_TYPE), UTF8ToUTF16(s.ColumnString(3))); string16 credit_card_number = UTF8ToUTF16(s.ColumnString(4)); // It could be non-empty prior to version 23. After that it encrypted in @@ -1621,10 +1621,10 @@ static CreditCard* CreditCardFromStatement(const sql::Statement& s) { Encryptor::DecryptString16(encrypted_cc, &credit_card_number); } } - creditcard->SetInfo(AutoFillType(CREDIT_CARD_NUMBER), credit_card_number); - creditcard->SetInfo(AutoFillType(CREDIT_CARD_EXP_MONTH), + credit_card->SetInfo(AutoFillType(CREDIT_CARD_NUMBER), credit_card_number); + credit_card->SetInfo(AutoFillType(CREDIT_CARD_EXP_MONTH), UTF8ToUTF16(s.ColumnString(5))); - creditcard->SetInfo(AutoFillType(CREDIT_CARD_EXP_4_DIGIT_YEAR), + credit_card->SetInfo(AutoFillType(CREDIT_CARD_EXP_4_DIGIT_YEAR), UTF8ToUTF16(s.ColumnString(6))); string16 credit_card_verification_code = UTF8ToUTF16(s.ColumnString(7)); @@ -1639,19 +1639,19 @@ static CreditCard* CreditCardFromStatement(const sql::Statement& s) { Encryptor::DecryptString16(encrypted_cc, &credit_card_verification_code); } } - creditcard->SetInfo(AutoFillType(CREDIT_CARD_VERIFICATION_CODE), + credit_card->SetInfo(AutoFillType(CREDIT_CARD_VERIFICATION_CODE), credit_card_verification_code); - creditcard->set_billing_address(UTF8ToUTF16(s.ColumnString(8))); - creditcard->set_shipping_address(UTF8ToUTF16(s.ColumnString(9))); + credit_card->set_billing_address(UTF8ToUTF16(s.ColumnString(8))); + credit_card->set_shipping_address(UTF8ToUTF16(s.ColumnString(9))); // Column 10 is processed above. // Column 11 is processed above. - return creditcard; + return credit_card; } bool WebDatabase::GetCreditCardForLabel(const string16& label, - CreditCard** creditcard) { - DCHECK(creditcard); + CreditCard** credit_card) { + DCHECK(credit_card); sql::Statement s(db_.GetUniqueStatement( "SELECT * FROM credit_cards " "WHERE label = ?")); @@ -1664,12 +1664,13 @@ bool WebDatabase::GetCreditCardForLabel(const string16& label, if (!s.Step()) return false; - *creditcard = CreditCardFromStatement(s); + *credit_card = CreditCardFromStatement(s); return s.Succeeded(); } -bool WebDatabase::GetCreditCardForID(int card_id, CreditCard** card) { +bool WebDatabase::GetCreditCardForID(int credit_card_id, + CreditCard** credit_card) { sql::Statement s(db_.GetUniqueStatement( "SELECT * FROM credit_cards " "WHERE unique_id = ?")); @@ -1678,19 +1679,19 @@ bool WebDatabase::GetCreditCardForID(int card_id, CreditCard** card) { return false; } - s.BindInt(0, card_id); + s.BindInt(0, credit_card_id); if (!s.Step()) return false; - *card = CreditCardFromStatement(s); + *credit_card = CreditCardFromStatement(s); return s.Succeeded(); } bool WebDatabase::GetCreditCards( - std::vector<CreditCard*>* creditcards) { - DCHECK(creditcards); - creditcards->clear(); + std::vector<CreditCard*>* credit_cards) { + DCHECK(credit_cards); + credit_cards->clear(); sql::Statement s(db_.GetUniqueStatement("SELECT * FROM credit_cards")); if (!s) { @@ -1699,13 +1700,13 @@ bool WebDatabase::GetCreditCards( } while (s.Step()) - creditcards->push_back(CreditCardFromStatement(s)); + credit_cards->push_back(CreditCardFromStatement(s)); return s.Succeeded(); } -bool WebDatabase::UpdateCreditCard(const CreditCard& creditcard) { - DCHECK(creditcard.unique_id()); +bool WebDatabase::UpdateCreditCard(const CreditCard& credit_card) { + DCHECK(credit_card.unique_id()); sql::Statement s(db_.GetUniqueStatement( "UPDATE credit_cards " "SET label=?, unique_id=?, name_on_card=?, type=?, card_number=?, " @@ -1718,15 +1719,15 @@ bool WebDatabase::UpdateCreditCard(const CreditCard& creditcard) { return false; } - BindCreditCardToStatement(creditcard, &s); - s.BindInt(12, creditcard.unique_id()); + BindCreditCardToStatement(credit_card, &s); + s.BindInt(12, credit_card.unique_id()); bool result = s.Run(); DCHECK_GT(db_.GetLastChangeCount(), 0); return result; } -bool WebDatabase::RemoveCreditCard(int creditcard_id) { - DCHECK_NE(0, creditcard_id); +bool WebDatabase::RemoveCreditCard(int credit_card_id) { + DCHECK_NE(0, credit_card_id); sql::Statement s(db_.GetUniqueStatement( "DELETE FROM credit_cards WHERE unique_id = ?")); if (!s) { @@ -1734,7 +1735,7 @@ bool WebDatabase::RemoveCreditCard(int creditcard_id) { return false; } - s.BindInt(0, creditcard_id); + s.BindInt(0, credit_card_id); return s.Run(); } diff --git a/chrome/browser/webdata/web_database.h b/chrome/browser/webdata/web_database.h index 07f30a9..18837309 100644 --- a/chrome/browser/webdata/web_database.h +++ b/chrome/browser/webdata/web_database.h @@ -237,24 +237,26 @@ class WebDatabase { virtual bool GetAutoFillProfiles(std::vector<AutoFillProfile*>* profiles); // Records a single credit card in the credit_cards table. - bool AddCreditCard(const CreditCard& creditcard); + bool AddCreditCard(const CreditCard& credit_card); - // Updates the database values for the specified profile. - bool UpdateCreditCard(const CreditCard& profile); + // Updates the database values for the specified credit card. + bool UpdateCreditCard(const CreditCard& credit_card); - // Removes a row from the autofill_profiles table. |profile_id| is the - // unique ID of the profile to remove. - bool RemoveCreditCard(int profile_id); + // Removes a row from the credit_cards table. |credit_card_id| is the + // unique ID of the credit card to remove. + bool RemoveCreditCard(int credit_card_id); - // Retrieves a profile with label |label|. The caller owns |profile|. + // Retrieves a credit card with label |label|. The caller owns + // |credit_card_id|. bool GetCreditCardForLabel(const string16& label, - CreditCard** profile); + CreditCard** credit_card); - // Retrieves credit card for a card with unique id |card_id|. - bool GetCreditCardForID(int card_id, CreditCard** card); + // Retrieves credit card for a card with unique id |credit_card_id|. + bool GetCreditCardForID(int credit_card_id, CreditCard** credit_card); - // Retrieves all profiles in the database. Caller owns the returned profiles. - virtual bool GetCreditCards(std::vector<CreditCard*>* profiles); + // Retrieves all credit cards in the database. Caller owns the returned + // credit cards. + virtual bool GetCreditCards(std::vector<CreditCard*>* credit_cards); ////////////////////////////////////////////////////////////////////////////// // |