Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 26cc4077 authored by Suren Baghdasaryan's avatar Suren Baghdasaryan
Browse files

Treat process group creation failure due to a dead process as non-fatal



Failure by Zygote to create a process group for newly spawned child is
treated as a fatal error. This is done to avoid leaving children in
Zygote's process group because such relationship can lead to
side-effects, like freezing Zygote when the child's group is being
frozen.
However, if the child died before it could be added into a process
group, there is not danger of leaving it in Zygote's group, therefore
such failure does not have to be fatal and crash system_server.
Check for this situation and when createProcessGroup() fails because
the child is dead, just log the error and keep going.

Bug: 270103958
Change-Id: I6646fbb85162da9087a9e3d7699ef081de277fca
Signed-off-by: default avatarSuren Baghdasaryan <surenb@google.com>
parent 65240d6e
Loading
Loading
Loading
Loading
+9 −4
Original line number Diff line number Diff line
@@ -1799,12 +1799,17 @@ static void SpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArray gids,
    if (!is_system_server && getuid() == 0) {
        const int rc = createProcessGroup(uid, getpid());
        if (rc != 0) {
            if (rc == -ESRCH) {
                // If process is dead, treat this as a non-fatal error
                ALOGE("createProcessGroup(%d, %d) failed: %s", uid, /* pid= */ 0, strerror(-rc));
            } else {
                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)));
            }
        }
    }

    SetGids(env, gids, is_child_zygote, fail_fn);
    SetRLimits(env, rlimits, fail_fn);