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

Commit bd503a4e authored by Craig Mautner's avatar Craig Mautner
Browse files

Allow for the possibility of null ActivityContainer

When BinderProxy is passed in as the IBinder for
getEnclosingActivityContainer the activity manager cannot turn it into
an ActivityRecord. This causes NPE in ActivityThread which is Not Good
(tm).

Allowing null to be returned when requesting an ActivityContainer and
handling it appropriately fixes this bug.

Fixes bug 12473669.

Change-Id: I6937636042f8853b3ddc2df40be010e7391e41a5
parent b6d9eb87
Loading
Loading
Loading
Loading
+26 −6
Original line number Diff line number Diff line
@@ -2027,7 +2027,12 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM
            IActivityContainer activityContainer =
                    createActivityContainer(parentActivityToken, callback);
            reply.writeNoException();
            if (activityContainer != null) {
                reply.writeInt(1);
                reply.writeStrongBinder(activityContainer.asBinder());
            } else {
                reply.writeInt(0);
            }
            return true;
        }

@@ -2036,7 +2041,12 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM
            IBinder activityToken = data.readStrongBinder();
            IActivityContainer activityContainer = getEnclosingActivityContainer(activityToken);
            reply.writeNoException();
            if (activityContainer != null) {
                reply.writeInt(1);
                reply.writeStrongBinder(activityContainer.asBinder());
            } else {
                reply.writeInt(0);
            }
            return true;
        }

@@ -4670,8 +4680,13 @@ class ActivityManagerProxy implements IActivityManager
        data.writeStrongBinder((IBinder)callback);
        mRemote.transact(CREATE_ACTIVITY_CONTAINER_TRANSACTION, data, reply, 0);
        reply.readException();
        IActivityContainer res =
                IActivityContainer.Stub.asInterface(reply.readStrongBinder());
        final int result = reply.readInt();
        final IActivityContainer res;
        if (result == 1) {
            res = IActivityContainer.Stub.asInterface(reply.readStrongBinder());
        } else {
            res = null;
        }
        data.recycle();
        reply.recycle();
        return res;
@@ -4685,8 +4700,13 @@ class ActivityManagerProxy implements IActivityManager
        data.writeStrongBinder(activityToken);
        mRemote.transact(GET_ACTIVITY_CONTAINER_TRANSACTION, data, reply, 0);
        reply.readException();
        IActivityContainer res =
                IActivityContainer.Stub.asInterface(reply.readStrongBinder());
        final int result = reply.readInt();
        final IActivityContainer res;
        if (result == 1) {
            res = IActivityContainer.Stub.asInterface(reply.readStrongBinder());
        } else {
            res = null;
        }
        data.recycle();
        reply.recycle();
        return res;
+2 −1
Original line number Diff line number Diff line
@@ -2225,7 +2225,8 @@ public final class ActivityThread {
        try {
            IActivityContainer container =
                    ActivityManagerNative.getDefault().getEnclosingActivityContainer(r.token);
            final int displayId = container.getDisplayId();
            final int displayId =
                    container == null ? Display.DEFAULT_DISPLAY : container.getDisplayId();
            if (displayId > Display.DEFAULT_DISPLAY) {
                Display display = dm.getRealDisplay(displayId, r.token);
                baseContext = appContext.createDisplayContext(display);