diff options
author | gfeher@chromium.org <gfeher@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-12-02 09:27:03 +0000 |
---|---|---|
committer | gfeher@chromium.org <gfeher@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-12-02 09:27:03 +0000 |
commit | f2ea0e7e43ed78908d91613f1f227af329aff20c (patch) | |
tree | df90821e364773c597f883c813dfdc53fbc33a77 | |
parent | 07750be2599b9699ec29b91a5cd1d4c86814700d (diff) | |
download | chromium_src-f2ea0e7e43ed78908d91613f1f227af329aff20c.zip chromium_src-f2ea0e7e43ed78908d91613f1f227af329aff20c.tar.gz chromium_src-f2ea0e7e43ed78908d91613f1f227af329aff20c.tar.bz2 |
Fix crash when the silent extension install policy is set to an empty list
Empty lists were not properly handled when the policy was refreshed.
BUG=64871
TEST=ExtensionManagementTest.ExternalPolicyRefresh
Review URL: http://codereview.chromium.org/5472002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@67988 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | base/values_util.cc | 3 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_management_browsertest.cc | 4 | ||||
-rw-r--r-- | chrome/browser/extensions/extensions_service.cc | 8 |
3 files changed, 11 insertions, 4 deletions
diff --git a/base/values_util.cc b/base/values_util.cc index ec3db71..31d8e8c 100644 --- a/base/values_util.cc +++ b/base/values_util.cc @@ -9,5 +9,6 @@ RefCountedList::RefCountedList(ListValue* list) { } RefCountedList::~RefCountedList() { - delete list_; + if (list_) + delete list_; } diff --git a/chrome/browser/extensions/extension_management_browsertest.cc b/chrome/browser/extensions/extension_management_browsertest.cc index 2529238..6120c73 100644 --- a/chrome/browser/extensions/extension_management_browsertest.cc +++ b/chrome/browser/extensions/extension_management_browsertest.cc @@ -353,4 +353,8 @@ IN_PROC_BROWSER_TEST_F(ExtensionManagementTest, ExternalPolicyRefresh) { EXPECT_EQ("2.0", extensions->at(size_before)->VersionString()); EXPECT_EQ(Extension::EXTERNAL_POLICY_DOWNLOAD, extensions->at(size_before)->location()); + + // Check that emptying the list doesn't cause any trouble. + prefs->ClearPref(prefs::kExtensionInstallForceList); + prefs->pref_notifier()->FireObservers(prefs::kExtensionInstallForceList); } diff --git a/chrome/browser/extensions/extensions_service.cc b/chrome/browser/extensions/extensions_service.cc index 8284def..9e7b359 100644 --- a/chrome/browser/extensions/extensions_service.cc +++ b/chrome/browser/extensions/extensions_service.cc @@ -1437,14 +1437,16 @@ void ExtensionsService::CheckForExternalUpdates() { void ExtensionsService::UpdateExternalPolicyExtensionProvider() { const ListValue* list_pref = profile_->GetPrefs()->GetList(prefs::kExtensionInstallForceList); - RefCountedList* list_copy = new RefCountedList( - static_cast<ListValue*>(list_pref->DeepCopy())); + ListValue* list_copy = NULL; + if (list_pref) + list_copy = static_cast<ListValue*>(list_pref->DeepCopy()); BrowserThread::PostTask( BrowserThread::FILE, FROM_HERE, NewRunnableMethod( backend_.get(), &ExtensionsServiceBackend::UpdateExternalPolicyExtensionProvider, - scoped_refptr<RefCountedList>(list_copy))); + scoped_refptr<RefCountedList>( + new RefCountedList(list_copy)))); } void ExtensionsService::UnloadExtension(const std::string& extension_id) { |