diff options
author | kalman <kalman@chromium.org> | 2015-09-22 14:56:31 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-09-22 22:09:13 +0000 |
commit | c2293dad51869910c2cc210ee3b00174e6cfeb70 (patch) | |
tree | de05301f20379396d94cf1c78fb2955477210844 /chrome/browser/extensions/api/processes | |
parent | 3a025353ed7d5639017b9a7f20da47e046f33372 (diff) | |
download | chromium_src-c2293dad51869910c2cc210ee3b00174e6cfeb70.zip chromium_src-c2293dad51869910c2cc210ee3b00174e6cfeb70.tar.gz chromium_src-c2293dad51869910c2cc210ee3b00174e6cfeb70.tar.bz2 |
Do not allow the extension process API to kill the browser process.
BUG=534501
R=creis@chromium.org
Review URL: https://codereview.chromium.org/1356193002
Cr-Commit-Position: refs/heads/master@{#350251}
Diffstat (limited to 'chrome/browser/extensions/api/processes')
4 files changed, 36 insertions, 19 deletions
diff --git a/chrome/browser/extensions/api/processes/processes_api.cc b/chrome/browser/extensions/api/processes/processes_api.cc index 2c1b7aa..4d33c33 100644 --- a/chrome/browser/extensions/api/processes/processes_api.cc +++ b/chrome/browser/extensions/api/processes/processes_api.cc @@ -637,32 +637,36 @@ void TerminateFunction::TerminateProcess() { #if defined(ENABLE_TASK_MANAGER) TaskManagerModel* model = TaskManager::GetInstance()->model(); - int count = model->ResourceCount(); - bool killed = false; bool found = false; - - for (int i = 0; i < count; ++i) { - if (model->IsResourceFirstInGroup(i)) { - if (process_id_ == model->GetUniqueChildProcessId(i)) { - found = true; - base::Process process = - base::Process::DeprecatedGetProcessFromHandle(model->GetProcess(i)); - killed = process.Terminate(content::RESULT_CODE_KILLED, true); + for (int i = 0, count = model->ResourceCount(); i < count; ++i) { + if (!model->IsResourceFirstInGroup(i) || + process_id_ != model->GetUniqueChildProcessId(i)) { + continue; + } + base::ProcessHandle process_handle = model->GetProcess(i); + if (process_handle == base::GetCurrentProcessHandle()) { + // Cannot kill the browser process. + // TODO(kalman): Are there other sensitive processes? + error_ = ErrorUtils::FormatErrorMessage(errors::kNotAllowedToTerminate, + base::IntToString(process_id_)); + } else { + base::Process process = + base::Process::DeprecatedGetProcessFromHandle(process_handle); + bool did_terminate = process.Terminate(content::RESULT_CODE_KILLED, true); + if (did_terminate) UMA_HISTOGRAM_COUNTS("ChildProcess.KilledByExtensionAPI", 1); - break; - } + SetResult(new base::FundamentalValue(did_terminate)); } + found = true; + break; } - if (!found) { error_ = ErrorUtils::FormatErrorMessage(errors::kProcessNotFound, - base::IntToString(process_id_)); - SendResponse(false); - } else { - SetResult(new base::FundamentalValue(killed)); - SendResponse(true); + base::IntToString(process_id_)); } + SendResponse(error_.empty()); + // Balance the AddRef in the RunAsync. Release(); #else @@ -757,7 +761,13 @@ void GetProcessInfoFunction::GatherProcessInfo() { } } } - DCHECK_EQ(process_ids_.size(), 0U); + // If not all processes were found, log them to the extension's console to + // help the developer, but don't fail the API call. + for (int pid : process_ids_) { + WriteToConsole(content::CONSOLE_MESSAGE_LEVEL_ERROR, + ErrorUtils::FormatErrorMessage(errors::kProcessNotFound, + base::IntToString(pid))); + } } SetResult(processes); diff --git a/chrome/browser/extensions/api/processes/processes_api_constants.cc b/chrome/browser/extensions/api/processes/processes_api_constants.cc index 394a2e7..39ac03e 100644 --- a/chrome/browser/extensions/api/processes/processes_api_constants.cc +++ b/chrome/browser/extensions/api/processes/processes_api_constants.cc @@ -52,6 +52,7 @@ const char kOnUpdatedWithMemory[] = "processes.onUpdatedWithMemory"; // Error strings. const char kExtensionNotSupported[] = "The Processes extension API is not supported on this platform."; +const char kNotAllowedToTerminate[] = "Not allowed to terminate process: *."; const char kProcessNotFound[] = "Process not found: *."; } // namespace processes_api_constants diff --git a/chrome/browser/extensions/api/processes/processes_api_constants.h b/chrome/browser/extensions/api/processes/processes_api_constants.h index afeeeb4..5dc8366 100644 --- a/chrome/browser/extensions/api/processes/processes_api_constants.h +++ b/chrome/browser/extensions/api/processes/processes_api_constants.h @@ -54,6 +54,7 @@ extern const char kOnUpdatedWithMemory[]; // Error strings. extern const char kExtensionNotSupported[]; +extern const char kNotAllowedToTerminate[]; extern const char kProcessNotFound[]; } // namespace processes_api_constants diff --git a/chrome/browser/extensions/api/processes/processes_apitest.cc b/chrome/browser/extensions/api/processes/processes_apitest.cc index f2672ce..934f33c 100644 --- a/chrome/browser/extensions/api/processes/processes_apitest.cc +++ b/chrome/browser/extensions/api/processes/processes_apitest.cc @@ -47,3 +47,8 @@ IN_PROC_BROWSER_TEST_F(ExtensionApiTest, ProcessesVsTaskManager) { UnloadExtension(last_loaded_extension_id()); EXPECT_EQ(1, model->update_requests_); } + +IN_PROC_BROWSER_TEST_F(ExtensionApiTest, CannotTerminateBrowserProcess) { + ASSERT_TRUE(RunExtensionTest("processes/terminate-browser-process")) + << message_; +} |