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:
Suren Baghdasaryan
2022-04-01 10:49:01 -07:00
parent 25976ab7be
commit d01f170598
2 changed files with 7 additions and 6 deletions

View File

@@ -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)));
}
}

View File

@@ -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 + ")");
}
}