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

Commit 0161bbc6 authored by Colin Cross's avatar Colin Cross Committed by Colin Cross
Browse files

ActivityManager: use Process.killProcessGroup to kill forked processes

Place newly-created processes in a process group, and use
killProcessGroup to kill any forked processes.

Bug: 15313911
Change-Id: I0f3e2eeebd9a910dae3f6b2801826c92aea03030
parent 503dca6f
Loading
Loading
Loading
Loading
+9 −0
Original line number Original line Diff line number Diff line
@@ -41,6 +41,7 @@
#include <cutils/sched_policy.h>
#include <cutils/sched_policy.h>
#include <utils/String8.h>
#include <utils/String8.h>
#include <selinux/android.h>
#include <selinux/android.h>
#include <processgroup/processgroup.h>


#include "android_runtime/AndroidRuntime.h"
#include "android_runtime/AndroidRuntime.h"
#include "JNIHelp.h"
#include "JNIHelp.h"
@@ -435,6 +436,14 @@ static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArra
      }
      }
    }
    }


    if (!is_system_server) {
        int rc = createProcessGroup(uid, getpid());
        if (rc != 0) {
            ALOGE("createProcessGroup(%d, %d) failed: %s", uid, pid, strerror(-rc));
            RuntimeAbort(env);
        }
    }

    SetGids(env, javaGids);
    SetGids(env, javaGids);


    SetRLimits(env, javaRlimits);
    SetRLimits(env, javaRlimits);
+17 −1
Original line number Original line Diff line number Diff line
@@ -2236,6 +2236,7 @@ public final class ActivityManagerService extends ActivityManagerNative
    }
    }
    private void start() {
    private void start() {
        Process.removeAllProcessGroups();
        mProcessCpuThread.start();
        mProcessCpuThread.start();
        mBatteryStatsService.publish(mContext);
        mBatteryStatsService.publish(mContext);
@@ -2827,6 +2828,7 @@ public final class ActivityManagerService extends ActivityManagerNative
            // An application record is attached to a previous process,
            // An application record is attached to a previous process,
            // clean it up now.
            // clean it up now.
            if (DEBUG_PROCESSES || DEBUG_CLEANUP) Slog.v(TAG, "App died: " + app);
            if (DEBUG_PROCESSES || DEBUG_CLEANUP) Slog.v(TAG, "App died: " + app);
            Process.killProcessGroup(app.info.uid, app.pid);
            handleAppDiedLocked(app, true, true);
            handleAppDiedLocked(app, true, true);
        }
        }
@@ -4069,6 +4071,8 @@ public final class ActivityManagerService extends ActivityManagerNative
            stats.noteProcessDiedLocked(app.info.uid, pid);
            stats.noteProcessDiedLocked(app.info.uid, pid);
        }
        }
        Process.killProcessGroup(app.info.uid, pid);
        // Clean up already done if the process has been re-started.
        // Clean up already done if the process has been re-started.
        if (app.pid == pid && app.thread != null &&
        if (app.pid == pid && app.thread != null &&
                app.thread.asBinder() == thread.asBinder()) {
                app.thread.asBinder() == thread.asBinder()) {
@@ -4307,7 +4311,10 @@ public final class ActivityManagerService extends ActivityManagerNative
            try {
            try {
                // 0 == continue, -1 = kill process immediately
                // 0 == continue, -1 = kill process immediately
                int res = mController.appEarlyNotResponding(app.processName, app.pid, annotation);
                int res = mController.appEarlyNotResponding(app.processName, app.pid, annotation);
                if (res < 0 && app.pid != MY_PID) Process.killProcess(app.pid);
                if (res < 0 && app.pid != MY_PID) {
                    Process.killProcess(app.pid);
                    Process.killProcessGroup(app.info.uid, app.pid);
                }
            } catch (RemoteException e) {
            } catch (RemoteException e) {
                mController = null;
                mController = null;
                Watchdog.getInstance().setActivityController(null);
                Watchdog.getInstance().setActivityController(null);
@@ -4413,6 +4420,7 @@ public final class ActivityManagerService extends ActivityManagerNative
                if (res != 0) {
                if (res != 0) {
                    if (res < 0 && app.pid != MY_PID) {
                    if (res < 0 && app.pid != MY_PID) {
                        Process.killProcess(app.pid);
                        Process.killProcess(app.pid);
                        Process.killProcessGroup(app.info.uid, app.pid);
                    } else {
                    } else {
                        synchronized (this) {
                        synchronized (this) {
                            mServices.scheduleServiceTimeoutLocked(app);
                            mServices.scheduleServiceTimeoutLocked(app);
@@ -5122,6 +5130,7 @@ public final class ActivityManagerService extends ActivityManagerNative
                mBatteryStatsService.removeIsolatedUid(app.uid, app.info.uid);
                mBatteryStatsService.removeIsolatedUid(app.uid, app.info.uid);
            }
            }
            killUnneededProcessLocked(app, reason);
            killUnneededProcessLocked(app, reason);
            Process.killProcessGroup(app.info.uid, app.pid);
            handleAppDiedLocked(app, true, allowRestart);
            handleAppDiedLocked(app, true, allowRestart);
            removeLruProcessLocked(app);
            removeLruProcessLocked(app);
@@ -5210,6 +5219,7 @@ public final class ActivityManagerService extends ActivityManagerNative
            EventLog.writeEvent(EventLogTags.AM_DROP_PROCESS, pid);
            EventLog.writeEvent(EventLogTags.AM_DROP_PROCESS, pid);
            if (pid > 0 && pid != MY_PID) {
            if (pid > 0 && pid != MY_PID) {
                Process.killProcessQuiet(pid);
                Process.killProcessQuiet(pid);
                //TODO: Process.killProcessGroup(app.info.uid, pid);
            } else {
            } else {
                try {
                try {
                    thread.scheduleExit();
                    thread.scheduleExit();
@@ -7409,6 +7419,7 @@ public final class ActivityManagerService extends ActivityManagerNative
                    pr.processName, pr.setAdj, reason);
                    pr.processName, pr.setAdj, reason);
            pr.killedByAm = true;
            pr.killedByAm = true;
            Process.killProcessQuiet(pr.pid);
            Process.killProcessQuiet(pr.pid);
            Process.killProcessGroup(pr.info.uid, pr.pid);
        }
        }
    }
    }
@@ -10749,11 +10760,15 @@ public final class ActivityManagerService extends ActivityManagerNative
                try {
                try {
                    String name = r != null ? r.processName : null;
                    String name = r != null ? r.processName : null;
                    int pid = r != null ? r.pid : Binder.getCallingPid();
                    int pid = r != null ? r.pid : Binder.getCallingPid();
                    int uid = r != null ? r.info.uid : Binder.getCallingUid();
                    if (!mController.appCrashed(name, pid,
                    if (!mController.appCrashed(name, pid,
                            shortMsg, longMsg, timeMillis, crashInfo.stackTrace)) {
                            shortMsg, longMsg, timeMillis, crashInfo.stackTrace)) {
                        Slog.w(TAG, "Force-killing crashed app " + name
                        Slog.w(TAG, "Force-killing crashed app " + name
                                + " at watcher's request");
                                + " at watcher's request");
                        Process.killProcess(pid);
                        Process.killProcess(pid);
                        if (r != null) {
                            Process.killProcessGroup(uid, pid);
                        }
                        return;
                        return;
                    }
                    }
                } catch (RemoteException e) {
                } catch (RemoteException e) {
@@ -16587,6 +16602,7 @@ public final class ActivityManagerService extends ActivityManagerNative
                                app.processName, app.setAdj, "empty");
                                app.processName, app.setAdj, "empty");
                        app.killedByAm = true;
                        app.killedByAm = true;
                        Process.killProcessQuiet(app.pid);
                        Process.killProcessQuiet(app.pid);
                        Process.killProcessGroup(app.info.uid, app.pid);
                    } else {
                    } else {
                        try {
                        try {
                            app.thread.scheduleExit();
                            app.thread.scheduleExit();