summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgfeher@chromium.org <gfeher@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-12-02 09:27:03 +0000
committergfeher@chromium.org <gfeher@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-12-02 09:27:03 +0000
commitf2ea0e7e43ed78908d91613f1f227af329aff20c (patch)
treedf90821e364773c597f883c813dfdc53fbc33a77
parent07750be2599b9699ec29b91a5cd1d4c86814700d (diff)
downloadchromium_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.cc3
-rw-r--r--chrome/browser/extensions/extension_management_browsertest.cc4
-rw-r--r--chrome/browser/extensions/extensions_service.cc8
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) {