Treat failure to create a process group as fatal
During process startup, system creates a process group and places the new process in it. If process group creation fails for some reason, the new child process will stay in its parent's group. This poses danger when the child is being frozen because the whole group is affected and its parent is being frozen as well. Considering that the parent of an app is Zygote, freezing it leads to the device becoming unusable. Fix this by treating group creation failure as a fatal error which would prevent the app from starting. When system_server fails to create a process group, it will throw an exception that's not caught and will self-destruct. Bug: 227395690 Test: fake group creation failure and confirm app failure to start Signed-off-by: Suren Baghdasaryan <surenb@google.com> Change-Id: Ib34b4a100c65a9a2705aaef8e7e32322fbedc531
This commit is contained in:
@@ -1599,10 +1599,11 @@ static void SpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArray gids,
|
||||
// since the directory is owned by root.
|
||||
if (!is_system_server && getuid() == 0) {
|
||||
const int rc = createProcessGroup(uid, getpid());
|
||||
if (rc == -EROFS) {
|
||||
ALOGW("createProcessGroup failed, kernel missing CONFIG_CGROUP_CPUACCT?");
|
||||
} else if (rc != 0) {
|
||||
ALOGE("createProcessGroup(%d, %d) failed: %s", uid, /* pid= */ 0, strerror(-rc));
|
||||
if (rc != 0) {
|
||||
fail_fn(rc == -EROFS ? CREATE_ERROR("createProcessGroup failed, kernel missing "
|
||||
"CONFIG_CGROUP_CPUACCT?")
|
||||
: CREATE_ERROR("createProcessGroup(%d, %d) failed: %s", uid,
|
||||
/* pid= */ 0, strerror(-rc)));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2425,8 +2425,8 @@ public final class ProcessList {
|
||||
if (!regularZygote) {
|
||||
// webview and app zygote don't have the permission to create the nodes
|
||||
if (Process.createProcessGroup(uid, startResult.pid) < 0) {
|
||||
Slog.e(ActivityManagerService.TAG, "Unable to create process group for "
|
||||
+ app.processName + " (" + startResult.pid + ")");
|
||||
throw new AssertionError("Unable to create process group for " + app.processName
|
||||
+ " (" + startResult.pid + ")");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user