summaryrefslogtreecommitdiffstats
path: root/chrome/browser/extensions/api/processes
diff options
context:
space:
mode:
authorkalman <kalman@chromium.org>2015-09-22 14:56:31 -0700
committerCommit bot <commit-bot@chromium.org>2015-09-22 22:09:13 +0000
commitc2293dad51869910c2cc210ee3b00174e6cfeb70 (patch)
treede05301f20379396d94cf1c78fb2955477210844 /chrome/browser/extensions/api/processes
parent3a025353ed7d5639017b9a7f20da47e046f33372 (diff)
downloadchromium_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')
-rw-r--r--chrome/browser/extensions/api/processes/processes_api.cc48
-rw-r--r--chrome/browser/extensions/api/processes/processes_api_constants.cc1
-rw-r--r--chrome/browser/extensions/api/processes/processes_api_constants.h1
-rw-r--r--chrome/browser/extensions/api/processes/processes_apitest.cc5
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_;
+}