Commit 27a63806 authored by Istiaque Ahmed's avatar Istiaque Ahmed Committed by Commit Bot

Extension: Fix DictionaryValue leak around webstore installer code.

WebstoreInstallHelper::Delegate::OnWebstoreParseSuccess passes
around unowned DictionaryValue pointers. In two cases in
dashboardPrivate and WebstoreStandaloneInstaller, there were
leaks.

Fix this by changing the method to pass owned pointers instead.

Bug: None
Test: None
Change-Id: I2165aa5cacac0d926cbeb8761ed4dc28a4610047
Reviewed-on: https://chromium-review.googlesource.com/c/1321865Reviewed-by: default avatarDevlin <rdevlin.cronin@chromium.org>
Reviewed-by: default avatarXiyuan Xia <xiyuan@chromium.org>
Commit-Queue: Istiaque Ahmed <lazyboy@chromium.org>
Cr-Commit-Position: refs/heads/master@{#606149}
parent fbac50f6
...@@ -221,13 +221,12 @@ class KioskAppData::WebstoreDataParser ...@@ -221,13 +221,12 @@ class KioskAppData::WebstoreDataParser
} }
// WebstoreInstallHelper::Delegate overrides: // WebstoreInstallHelper::Delegate overrides:
void OnWebstoreParseSuccess(const std::string& id, void OnWebstoreParseSuccess(
const SkBitmap& icon, const std::string& id,
base::DictionaryValue* parsed_manifest) override { const SkBitmap& icon,
// Takes ownership of |parsed_manifest|. std::unique_ptr<base::DictionaryValue> parsed_manifest) override {
extensions::Manifest manifest( extensions::Manifest manifest(extensions::Manifest::INVALID_LOCATION,
extensions::Manifest::INVALID_LOCATION, std::move(parsed_manifest));
std::unique_ptr<base::DictionaryValue>(parsed_manifest));
if (!IsValidKioskAppManifest(manifest)) { if (!IsValidKioskAppManifest(manifest)) {
ReportFailure(); ReportFailure();
......
...@@ -99,9 +99,9 @@ DashboardPrivateShowPermissionPromptForDelegatedInstallFunction::Run() { ...@@ -99,9 +99,9 @@ DashboardPrivateShowPermissionPromptForDelegatedInstallFunction::Run() {
void DashboardPrivateShowPermissionPromptForDelegatedInstallFunction:: void DashboardPrivateShowPermissionPromptForDelegatedInstallFunction::
OnWebstoreParseSuccess( OnWebstoreParseSuccess(
const std::string& id, const std::string& id,
const SkBitmap& icon, const SkBitmap& icon,
base::DictionaryValue* parsed_manifest) { std::unique_ptr<base::DictionaryValue> parsed_manifest) {
CHECK_EQ(params_->details.id, id); CHECK_EQ(params_->details.id, id);
CHECK(parsed_manifest); CHECK(parsed_manifest);
...@@ -110,12 +110,8 @@ void DashboardPrivateShowPermissionPromptForDelegatedInstallFunction:: ...@@ -110,12 +110,8 @@ void DashboardPrivateShowPermissionPromptForDelegatedInstallFunction::
std::string error; std::string error;
dummy_extension_ = ExtensionInstallPrompt::GetLocalizedExtensionForDisplay( dummy_extension_ = ExtensionInstallPrompt::GetLocalizedExtensionForDisplay(
parsed_manifest, parsed_manifest.get(), Extension::FROM_WEBSTORE, id, localized_name,
Extension::FROM_WEBSTORE, std::string(), &error);
id,
localized_name,
std::string(),
&error);
if (!dummy_extension_.get()) { if (!dummy_extension_.get()) {
OnWebstoreParseFailure(params_->details.id, OnWebstoreParseFailure(params_->details.id,
......
...@@ -42,9 +42,10 @@ class DashboardPrivateShowPermissionPromptForDelegatedInstallFunction ...@@ -42,9 +42,10 @@ class DashboardPrivateShowPermissionPromptForDelegatedInstallFunction
ExtensionFunction::ResponseAction Run() override; ExtensionFunction::ResponseAction Run() override;
// WebstoreInstallHelper::Delegate: // WebstoreInstallHelper::Delegate:
void OnWebstoreParseSuccess(const std::string& id, void OnWebstoreParseSuccess(
const SkBitmap& icon, const std::string& id,
base::DictionaryValue* parsed_manifest) override; const SkBitmap& icon,
std::unique_ptr<base::DictionaryValue> parsed_manifest) override;
void OnWebstoreParseFailure(const std::string& id, void OnWebstoreParseFailure(const std::string& id,
InstallHelperResultCode result, InstallHelperResultCode result,
const std::string& error_message) override; const std::string& error_message) override;
......
...@@ -253,10 +253,10 @@ WebstorePrivateBeginInstallWithManifest3Function::Run() { ...@@ -253,10 +253,10 @@ WebstorePrivateBeginInstallWithManifest3Function::Run() {
void WebstorePrivateBeginInstallWithManifest3Function::OnWebstoreParseSuccess( void WebstorePrivateBeginInstallWithManifest3Function::OnWebstoreParseSuccess(
const std::string& id, const std::string& id,
const SkBitmap& icon, const SkBitmap& icon,
base::DictionaryValue* parsed_manifest) { std::unique_ptr<base::DictionaryValue> parsed_manifest) {
CHECK_EQ(details().id, id); CHECK_EQ(details().id, id);
CHECK(parsed_manifest); CHECK(parsed_manifest);
parsed_manifest_.reset(parsed_manifest); parsed_manifest_ = std::move(parsed_manifest);
icon_ = icon; icon_ = icon;
std::string localized_name = std::string localized_name =
......
...@@ -59,9 +59,10 @@ class WebstorePrivateBeginInstallWithManifest3Function ...@@ -59,9 +59,10 @@ class WebstorePrivateBeginInstallWithManifest3Function
ExtensionFunction::ResponseAction Run() override; ExtensionFunction::ResponseAction Run() override;
// WebstoreInstallHelper::Delegate: // WebstoreInstallHelper::Delegate:
void OnWebstoreParseSuccess(const std::string& id, void OnWebstoreParseSuccess(
const SkBitmap& icon, const std::string& id,
base::DictionaryValue* parsed_manifest) override; const SkBitmap& icon,
std::unique_ptr<base::DictionaryValue> parsed_manifest) override;
void OnWebstoreParseFailure(const std::string& id, void OnWebstoreParseFailure(const std::string& id,
InstallHelperResultCode result, InstallHelperResultCode result,
const std::string& error_message) override; const std::string& error_message) override;
......
...@@ -139,7 +139,7 @@ void WebstoreInstallHelper::ReportResultsIfComplete() { ...@@ -139,7 +139,7 @@ void WebstoreInstallHelper::ReportResultsIfComplete() {
return; return;
if (error_.empty() && parsed_manifest_) if (error_.empty() && parsed_manifest_)
delegate_->OnWebstoreParseSuccess(id_, icon_, parsed_manifest_.release()); delegate_->OnWebstoreParseSuccess(id_, icon_, std::move(parsed_manifest_));
else else
delegate_->OnWebstoreParseFailure(id_, parse_error_, error_); delegate_->OnWebstoreParseFailure(id_, parse_error_, error_);
} }
......
...@@ -48,11 +48,11 @@ class WebstoreInstallHelper : public base::RefCounted<WebstoreInstallHelper>, ...@@ -48,11 +48,11 @@ class WebstoreInstallHelper : public base::RefCounted<WebstoreInstallHelper>,
}; };
// Called when we've successfully parsed the manifest and decoded the icon // Called when we've successfully parsed the manifest and decoded the icon
// in the utility process. Ownership of parsed_manifest is transferred. // in the utility process.
virtual void OnWebstoreParseSuccess( virtual void OnWebstoreParseSuccess(
const std::string& id, const std::string& id,
const SkBitmap& icon, const SkBitmap& icon,
base::DictionaryValue* parsed_manifest) = 0; std::unique_ptr<base::DictionaryValue> parsed_manifest) = 0;
// Called to indicate a parse failure. The |result_code| parameter should // Called to indicate a parse failure. The |result_code| parameter should
// indicate whether the problem was with the manifest or icon. // indicate whether the problem was with the manifest or icon.
......
...@@ -306,7 +306,7 @@ void WebstoreStandaloneInstaller::OnWebstoreResponseParseFailure( ...@@ -306,7 +306,7 @@ void WebstoreStandaloneInstaller::OnWebstoreResponseParseFailure(
void WebstoreStandaloneInstaller::OnWebstoreParseSuccess( void WebstoreStandaloneInstaller::OnWebstoreParseSuccess(
const std::string& id, const std::string& id,
const SkBitmap& icon, const SkBitmap& icon,
base::DictionaryValue* manifest) { std::unique_ptr<base::DictionaryValue> manifest) {
CHECK_EQ(id_, id); CHECK_EQ(id_, id);
if (!CheckRequestorAlive()) { if (!CheckRequestorAlive()) {
...@@ -314,7 +314,7 @@ void WebstoreStandaloneInstaller::OnWebstoreParseSuccess( ...@@ -314,7 +314,7 @@ void WebstoreStandaloneInstaller::OnWebstoreParseSuccess(
return; return;
} }
manifest_.reset(manifest); manifest_ = std::move(manifest);
icon_ = icon; icon_ = icon;
OnManifestParsed(); OnManifestParsed();
......
...@@ -171,9 +171,10 @@ class WebstoreStandaloneInstaller ...@@ -171,9 +171,10 @@ class WebstoreStandaloneInstaller
void OnWebstoreResponseParseFailure(const std::string& error) override; void OnWebstoreResponseParseFailure(const std::string& error) override;
// WebstoreInstallHelper::Delegate interface implementation. // WebstoreInstallHelper::Delegate interface implementation.
void OnWebstoreParseSuccess(const std::string& id, void OnWebstoreParseSuccess(
const SkBitmap& icon, const std::string& id,
base::DictionaryValue* parsed_manifest) override; const SkBitmap& icon,
std::unique_ptr<base::DictionaryValue> parsed_manifest) override;
void OnWebstoreParseFailure(const std::string& id, void OnWebstoreParseFailure(const std::string& id,
InstallHelperResultCode result_code, InstallHelperResultCode result_code,
const std::string& error_message) override; const std::string& error_message) override;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment