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

Commit 2aa255a7 authored by Wale Ogunwale's avatar Wale Ogunwale Committed by Android (Google) Code Review
Browse files

Merge "Revert "Collect NeededUriGrants without holding locks."" into qt-dev

parents 075baa2e 586a8ee7
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -43,14 +43,14 @@ public interface UriGrantsManagerInternal {
            int callingUid, String targetPkg, Uri uri, int modeFlags, int userId);
    NeededUriGrants checkGrantUriPermissionFromIntent(int callingUid,
            String targetPkg, Intent intent, int mode, NeededUriGrants needed, int targetUserId);
    NeededUriGrants checkGrantUriPermissionFromIntent(int callingUid,
            Intent intent, String targetPkg, int targetUserId);
    /**
     * Grant Uri permissions from one app to another. This method only extends
     * permission grants if {@code callingUid} has permission to them.
     */
    void grantUriPermissionFromIntent(int callingUid,
            String targetPkg, Intent intent, int targetUserId);
    void grantUriPermissionFromIntent(int callingUid,
            String targetPkg, Intent intent, UriPermissionOwner owner, int targetUserId);
    void grantUriPermissionUncheckedFromIntent(
            NeededUriGrants needed, UriPermissionOwner owner);
    IBinder newUriPermissionOwner(String name);
+6 −7
Original line number Diff line number Diff line
@@ -1362,21 +1362,20 @@ public class UriGrantsManagerService extends IUriGrantsManager.Stub {
        }

        @Override
        public NeededUriGrants checkGrantUriPermissionFromIntent(int callingUid, Intent intent,
                String targetPkg, int targetUserId) {
        public void grantUriPermissionFromIntent(int callingUid, String targetPkg, Intent intent,
                int targetUserId) {
            synchronized (mLock) {
                final int mode = (intent != null) ? intent.getFlags() : 0;
                return UriGrantsManagerService.this.checkGrantUriPermissionFromIntent(
                        callingUid, targetPkg, intent, mode, null, targetUserId);
                UriGrantsManagerService.this.grantUriPermissionFromIntent(
                        callingUid, targetPkg, intent, null, targetUserId);
            }
        }

        @Override
        public void grantUriPermissionFromIntent(int callingUid, String targetPkg, Intent intent,
                int targetUserId) {
                UriPermissionOwner owner, int targetUserId) {
            synchronized (mLock) {
                UriGrantsManagerService.this.grantUriPermissionFromIntent(
                        callingUid, targetPkg, intent, null, targetUserId);
                        callingUid, targetPkg, intent, owner, targetUserId);
            }
        }

+3 −5
Original line number Diff line number Diff line
@@ -215,7 +215,6 @@ import com.android.server.AttributeCache;
import com.android.server.AttributeCache.Entry;
import com.android.server.am.AppTimeTracker;
import com.android.server.am.PendingIntentRecord;
import com.android.server.uri.NeededUriGrants;
import com.android.server.uri.UriPermissionOwner;
import com.android.server.wm.ActivityMetricsLogger.WindowingModeTransitionInfoSnapshot;
import com.android.server.wm.ActivityStack.ActivityState;
@@ -1600,11 +1599,10 @@ final class ActivityRecord extends ConfigurationContainer {
     * Deliver a new Intent to an existing activity, so that its onNewIntent()
     * method will be called at the proper time.
     */
    final void deliverNewIntentLocked(int callingUid, Intent intent, NeededUriGrants intentGrants,
            String referrer) {
    final void deliverNewIntentLocked(int callingUid, Intent intent, String referrer) {
        // The activity now gets access to the data associated with this Intent.
        mAtmService.mUgmInternal.grantUriPermissionUncheckedFromIntent(intentGrants,
                getUriPermissionsLocked());
        mAtmService.mUgmInternal.grantUriPermissionFromIntent(callingUid, packageName,
                intent, getUriPermissionsLocked(), mUserId);
        final ReferrerIntent rintent = new ReferrerIntent(intent, referrer);
        boolean unsent = true;
        final boolean isTopActivityWhileSleeping = isTopRunningActivity() && isSleeping();
+47 −49
Original line number Diff line number Diff line
@@ -162,7 +162,6 @@ import com.android.server.am.ActivityManagerService.ItemMatcher;
import com.android.server.am.AppTimeTracker;
import com.android.server.am.EventLogTags;
import com.android.server.am.PendingIntentRecord;
import com.android.server.uri.NeededUriGrants;

import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -2781,7 +2780,7 @@ class ActivityStack extends ConfigurationContainer {
            if (DEBUG_STATES) Slog.d(TAG_STATES,
                    "no-history finish of " + mLastNoHistoryActivity + " on new resume");
            requestFinishActivityLocked(mLastNoHistoryActivity.appToken, Activity.RESULT_CANCELED,
                    null, null, "resume-no-history", false);
                    null, "resume-no-history", false);
            mLastNoHistoryActivity = null;
        }

@@ -3015,7 +3014,7 @@ class ActivityStack extends ConfigurationContainer {
                // If any exception gets thrown, toss away this
                // activity and try the next one.
                Slog.w(TAG, "Exception thrown during resume of " + next, e);
                requestFinishActivityLocked(next.appToken, Activity.RESULT_CANCELED, null, null,
                requestFinishActivityLocked(next.appToken, Activity.RESULT_CANCELED, null,
                        "resume-exception", true);
                return true;
            }
@@ -3423,7 +3422,7 @@ class ActivityStack extends ConfigurationContainer {
                    if (DEBUG_TASKS) Slog.w(TAG_TASKS,
                            "resetTaskIntendedTask: calling finishActivity on " + p);
                    if (finishActivityLocked(
                            p, Activity.RESULT_CANCELED, null, null, "reset-task", false)) {
                            p, Activity.RESULT_CANCELED, null, "reset-task", false)) {
                        end--;
                        srcPos--;
                    }
@@ -3502,7 +3501,7 @@ class ActivityStack extends ConfigurationContainer {
                            continue;
                        }
                        finishActivityLocked(
                                p, Activity.RESULT_CANCELED, null, null, "move-affinity", false);
                                p, Activity.RESULT_CANCELED, null, "move-affinity", false);
                    }
                } else {
                    if (taskInsertionPoint < 0) {
@@ -3536,8 +3535,8 @@ class ActivityStack extends ConfigurationContainer {
                        if (targetNdx > 0) {
                            ActivityRecord p = taskActivities.get(targetNdx - 1);
                            if (p.intent.getComponent().equals(target.intent.getComponent())) {
                                finishActivityLocked(p, Activity.RESULT_CANCELED, null, null,
                                        "replace", false);
                                finishActivityLocked(p, Activity.RESULT_CANCELED, null, "replace",
                                        false);
                            }
                        }
                    }
@@ -3597,21 +3596,22 @@ class ActivityStack extends ConfigurationContainer {
        return taskTop;
    }

    void sendActivityResultLocked(int callingUid, ActivityRecord r, String resultWho,
            int requestCode, int resultCode, Intent resultData, NeededUriGrants resultGrants) {
    void sendActivityResultLocked(int callingUid, ActivityRecord r,
            String resultWho, int requestCode, int resultCode, Intent data) {

        if (callingUid > 0) {
            mService.mUgmInternal.grantUriPermissionUncheckedFromIntent(resultGrants,
                    r.getUriPermissionsLocked());
            mService.mUgmInternal.grantUriPermissionFromIntent(callingUid, r.packageName,
                    data, r.getUriPermissionsLocked(), r.mUserId);
        }

        if (DEBUG_RESULTS) Slog.v(TAG, "Send activity result to " + r
                + " : who=" + resultWho + " req=" + requestCode
                + " res=" + resultCode + " data=" + resultData);
                + " res=" + resultCode + " data=" + data);
        if (mResumedActivity == r && r.attachedToProcess()) {
            try {
                ArrayList<ResultInfo> list = new ArrayList<ResultInfo>();
                list.add(new ResultInfo(resultWho, requestCode,
                        resultCode, resultData));
                        resultCode, data));
                mService.getLifecycleManager().scheduleTransaction(r.app.getThread(), r.appToken,
                        ActivityResultItem.obtain(list));
                return;
@@ -3620,7 +3620,7 @@ class ActivityStack extends ConfigurationContainer {
            }
        }

        r.addResultLocked(null, resultWho, requestCode, resultCode, resultData);
        r.addResultLocked(null, resultWho, requestCode, resultCode, data);
    }

    /** Returns true if the task is one of the task finishing on-top of the top running task. */
@@ -3727,8 +3727,8 @@ class ActivityStack extends ConfigurationContainer {
            if (!r.finishing) {
                if (!shouldSleepActivities()) {
                    if (DEBUG_STATES) Slog.d(TAG_STATES, "no-history finish of " + r);
                    if (requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED,
                            null, null, "stop-no-history", false)) {
                    if (requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null,
                            "stop-no-history", false)) {
                        // If {@link requestFinishActivityLocked} returns {@code true},
                        // {@link adjustFocusedActivityStack} would have been already called.
                        r.resumeKeyDispatchingLocked();
@@ -3784,7 +3784,7 @@ class ActivityStack extends ConfigurationContainer {
     * some reason it is being left as-is.
     */
    final boolean requestFinishActivityLocked(IBinder token, int resultCode,
            Intent resultData, NeededUriGrants resultGrants, String reason, boolean oomAdj) {
            Intent resultData, String reason, boolean oomAdj) {
        ActivityRecord r = isInStackLocked(token);
        if (DEBUG_RESULTS || DEBUG_STATES) Slog.v(TAG_STATES,
                "Finishing activity token=" + token + " r="
@@ -3794,7 +3794,7 @@ class ActivityStack extends ConfigurationContainer {
            return false;
        }

        finishActivityLocked(r, resultCode, resultData, resultGrants, reason, oomAdj);
        finishActivityLocked(r, resultCode, resultData, reason, oomAdj);
        return true;
    }

@@ -3806,8 +3806,8 @@ class ActivityStack extends ConfigurationContainer {
                if (r.resultTo == self && r.requestCode == requestCode) {
                    if ((r.resultWho == null && resultWho == null) ||
                        (r.resultWho != null && r.resultWho.equals(resultWho))) {
                        finishActivityLocked(r, Activity.RESULT_CANCELED, null, null,
                                "request-sub", false);
                        finishActivityLocked(r, Activity.RESULT_CANCELED, null, "request-sub",
                                false);
                    }
                }
            }
@@ -3837,7 +3837,7 @@ class ActivityStack extends ConfigurationContainer {
        int activityNdx = task.mActivities.indexOf(r);
        getDisplay().mDisplayContent.prepareAppTransition(
                TRANSIT_CRASHING_ACTIVITY_CLOSE, false /* alwaysKeepCurrent */);
        finishActivityLocked(r, Activity.RESULT_CANCELED, null, null, reason, false);
        finishActivityLocked(r, Activity.RESULT_CANCELED, null, reason, false);
        finishedTask = task;
        // Also terminate any activities below it that aren't yet
        // stopped, to avoid a situation where one will get
@@ -3858,7 +3858,7 @@ class ActivityStack extends ConfigurationContainer {
                if (!r.isActivityTypeHome() || mService.mHomeProcess != r.app) {
                    Slog.w(TAG, "  Force finishing activity "
                            + r.intent.getComponent().flattenToShortString());
                    finishActivityLocked(r, Activity.RESULT_CANCELED, null, null, reason, false);
                    finishActivityLocked(r, Activity.RESULT_CANCELED, null, reason, false);
                }
            }
        }
@@ -3874,8 +3874,8 @@ class ActivityStack extends ConfigurationContainer {
                for (int activityNdx = tr.mActivities.size() - 1; activityNdx >= 0; --activityNdx) {
                    ActivityRecord r = tr.mActivities.get(activityNdx);
                    if (!r.finishing) {
                        finishActivityLocked(r, Activity.RESULT_CANCELED, null, null,
                                "finish-voice", false);
                        finishActivityLocked(r, Activity.RESULT_CANCELED, null, "finish-voice",
                                false);
                        didOne = true;
                    }
                }
@@ -3911,14 +3911,12 @@ class ActivityStack extends ConfigurationContainer {
            if (!Objects.equals(cur.taskAffinity, r.taskAffinity)) {
                break;
            }
            finishActivityLocked(cur, Activity.RESULT_CANCELED, null, null,
                    "request-affinity", true);
            finishActivityLocked(cur, Activity.RESULT_CANCELED, null, "request-affinity", true);
        }
        return true;
    }

    private void finishActivityResultsLocked(ActivityRecord r, int resultCode, Intent resultData,
            NeededUriGrants resultGrants) {
    private void finishActivityResultsLocked(ActivityRecord r, int resultCode, Intent resultData) {
        // send the result
        ActivityRecord resultTo = r.resultTo;
        if (resultTo != null) {
@@ -3931,8 +3929,9 @@ class ActivityStack extends ConfigurationContainer {
                }
            }
            if (r.info.applicationInfo.uid > 0) {
                mService.mUgmInternal.grantUriPermissionUncheckedFromIntent(resultGrants,
                        resultTo.getUriPermissionsLocked());
                mService.mUgmInternal.grantUriPermissionFromIntent(r.info.applicationInfo.uid,
                        resultTo.packageName, resultData,
                        resultTo.getUriPermissionsLocked(), resultTo.mUserId);
            }
            resultTo.addResultLocked(r, r.resultWho, r.requestCode, resultCode, resultData);
            r.resultTo = null;
@@ -3948,10 +3947,12 @@ class ActivityStack extends ConfigurationContainer {
        r.icicle = null;
    }

    /**
     * See {@link #finishActivityLocked(ActivityRecord, int, Intent, String, boolean, boolean)}
     */
    final boolean finishActivityLocked(ActivityRecord r, int resultCode, Intent resultData,
            NeededUriGrants resultGrants, String reason, boolean oomAdj) {
        return finishActivityLocked(r, resultCode, resultData, resultGrants, reason, oomAdj,
                !PAUSE_IMMEDIATELY);
            String reason, boolean oomAdj) {
        return finishActivityLocked(r, resultCode, resultData, reason, oomAdj, !PAUSE_IMMEDIATELY);
    }

    /**
@@ -3959,7 +3960,7 @@ class ActivityStack extends ConfigurationContainer {
     * list, or false if it is still in the list and will be removed later.
     */
    final boolean finishActivityLocked(ActivityRecord r, int resultCode, Intent resultData,
            NeededUriGrants resultGrants, String reason, boolean oomAdj, boolean pauseImmediately) {
            String reason, boolean oomAdj, boolean pauseImmediately) {
        if (r.finishing) {
            Slog.w(TAG, "Duplicate finish request for " + r);
            return false;
@@ -3989,7 +3990,7 @@ class ActivityStack extends ConfigurationContainer {

            adjustFocusedActivityStack(r, "finishActivity");

            finishActivityResultsLocked(r, resultCode, resultData, resultGrants);
            finishActivityResultsLocked(r, resultCode, resultData);

            final boolean endTask = index <= 0 && !task.isClearingToReuseTask();
            final int transit = endTask ? TRANSIT_TASK_CLOSE : TRANSIT_ACTIVITY_CLOSE;
@@ -4222,9 +4223,8 @@ class ActivityStack extends ConfigurationContainer {
        return false;
    }

    final boolean navigateUpToLocked(ActivityRecord srec, Intent destIntent,
            NeededUriGrants destGrants, int resultCode, Intent resultData,
            NeededUriGrants resultGrants) {
    final boolean navigateUpToLocked(ActivityRecord srec, Intent destIntent, int resultCode,
            Intent resultData) {
        final TaskRecord task = srec.getTaskRecord();
        final ArrayList<ActivityRecord> activities = task.mActivities;
        final int start = activities.indexOf(srec);
@@ -4271,8 +4271,7 @@ class ActivityStack extends ConfigurationContainer {
        final long origId = Binder.clearCallingIdentity();
        for (int i = start; i > finishTo; i--) {
            ActivityRecord r = activities.get(i);
            requestFinishActivityLocked(r.appToken, resultCode, resultData, resultGrants,
                    "navigate-up", true);
            requestFinishActivityLocked(r.appToken, resultCode, resultData, "navigate-up", true);
            // Only return the supplied result for the first activity finished
            resultCode = Activity.RESULT_CANCELED;
            resultData = null;
@@ -4286,7 +4285,7 @@ class ActivityStack extends ConfigurationContainer {
                    parentLaunchMode == ActivityInfo.LAUNCH_SINGLE_TOP ||
                    (destIntentFlags & Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0) {
                parent.deliverNewIntentLocked(srec.info.applicationInfo.uid, destIntent,
                        destGrants, srec.packageName);
                        srec.packageName);
            } else {
                try {
                    ActivityInfo aInfo = AppGlobals.getPackageManager().getActivityInfo(
@@ -4310,7 +4309,7 @@ class ActivityStack extends ConfigurationContainer {
                    foundParentInTask = false;
                }
                requestFinishActivityLocked(parent.appToken, resultCode,
                        resultData, resultGrants, "navigate-top", true);
                        resultData, "navigate-top", true);
            }
        }
        Binder.restoreCallingIdentity(origId);
@@ -4395,7 +4394,7 @@ class ActivityStack extends ConfigurationContainer {
    }

    private void removeActivityFromHistoryLocked(ActivityRecord r, String reason) {
        finishActivityResultsLocked(r, Activity.RESULT_CANCELED, null, null);
        finishActivityResultsLocked(r, Activity.RESULT_CANCELED, null);
        r.makeFinishingLocked();
        if (DEBUG_ADD_REMOVE) Slog.i(TAG_ADD_REMOVE,
                "Removing activity " + r + " from stack callers=" + Debug.getCallers(5));
@@ -5127,8 +5126,7 @@ class ActivityStack extends ConfigurationContainer {
            for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
                final ActivityRecord r = activities.get(activityNdx);
                if ((r.info.flags&ActivityInfo.FLAG_FINISH_ON_CLOSE_SYSTEM_DIALOGS) != 0) {
                    finishActivityLocked(r, Activity.RESULT_CANCELED, null, null,
                            "close-sys", true);
                    finishActivityLocked(r, Activity.RESULT_CANCELED, null, "close-sys", true);
                }
            }
        }
@@ -5172,8 +5170,8 @@ class ActivityStack extends ConfigurationContainer {
                    didSomething = true;
                    Slog.i(TAG, "  Force finishing activity " + r);
                    lastTask = r.getTaskRecord();
                    finishActivityLocked(r, Activity.RESULT_CANCELED, null, null,
                            "force-stop", true);
                    finishActivityLocked(r, Activity.RESULT_CANCELED, null, "force-stop",
                            true);
                }
            }
        }
@@ -5227,8 +5225,8 @@ class ActivityStack extends ConfigurationContainer {
            final ArrayList<ActivityRecord> activities = mTaskHistory.get(top).mActivities;
            int activityTop = activities.size() - 1;
            if (activityTop >= 0) {
                finishActivityLocked(activities.get(activityTop), Activity.RESULT_CANCELED,
                        null, null, "unhandled-back", true);
                finishActivityLocked(activities.get(activityTop), Activity.RESULT_CANCELED, null,
                        "unhandled-back", true);
            }
        }
    }
+10 −14
Original line number Diff line number Diff line
@@ -140,7 +140,6 @@ import com.android.internal.util.function.pooled.PooledLambda;
import com.android.server.am.ActivityManagerService;
import com.android.server.am.EventLogTags;
import com.android.server.am.UserState;
import com.android.server.uri.NeededUriGrants;

import java.io.FileDescriptor;
import java.io.IOException;
@@ -404,17 +403,14 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
        final int startFlags;
        final ActivityStack stack;
        final WindowProcessController callerApp;
        final NeededUriGrants neededGrants;

        PendingActivityLaunch(ActivityRecord r, ActivityRecord sourceRecord,
                int startFlags, ActivityStack stack, WindowProcessController callerApp,
                NeededUriGrants neededGrants) {
            this.r = r;
            this.sourceRecord = sourceRecord;
            this.startFlags = startFlags;
            this.stack = stack;
            this.callerApp = callerApp;
            this.neededGrants = neededGrants;
        PendingActivityLaunch(ActivityRecord _r, ActivityRecord _sourceRecord,
                int _startFlags, ActivityStack _stack, WindowProcessController app) {
            r = _r;
            sourceRecord = _sourceRecord;
            startFlags = _startFlags;
            stack = _stack;
            callerApp = app;
        }

        void sendErrorResult(String message) {
@@ -878,8 +874,8 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
                    Slog.e(TAG, "Second failure launching "
                            + r.intent.getComponent().flattenToShortString() + ", giving up", e);
                    proc.appDied();
                    stack.requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED,
                            null, null, "2nd-crash", false);
                    stack.requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null,
                            "2nd-crash", false);
                    return false;
                }

@@ -1024,7 +1020,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks {
            if (resultRecord != null) {
                resultStack.sendActivityResultLocked(-1,
                        resultRecord, resultWho, requestCode,
                        Activity.RESULT_CANCELED, null, null);
                        Activity.RESULT_CANCELED, null);
            }
            final String msg;
            if (actionRestriction == ACTIVITY_RESTRICTION_PERMISSION) {
Loading