Loading core/java/android/app/ActivityManager.java +12 −8 Original line number Diff line number Diff line Loading @@ -64,6 +64,7 @@ import android.os.ServiceManager; import android.os.SystemProperties; import android.os.UserHandle; import android.os.WorkSource; import android.permission.PermissionManager; import android.util.ArrayMap; import android.util.DisplayMetrics; import android.util.Singleton; Loading Loading @@ -3738,6 +3739,7 @@ public class ActivityManager { } // Isolated processes don't get any permissions. if (UserHandle.isIsolated(uid)) { PermissionManager.addPermissionDenialHint("uid " + uid + " is isolated"); return PackageManager.PERMISSION_DENIED; } // If there is a uid that owns whatever is being accessed, it has Loading @@ -3753,24 +3755,26 @@ public class ActivityManager { Slog.w(TAG, "Permission denied: checkComponentPermission() owningUid=" + owningUid, here); */ PermissionManager.addPermissionDenialHint( "Target is not exported. owningUid=" + owningUid); return PackageManager.PERMISSION_DENIED; } if (permission == null) { return PackageManager.PERMISSION_GRANTED; } try { return AppGlobals.getPackageManager() .checkUidPermission(permission, uid); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } return checkUidPermission(permission, uid); } /** @hide */ public static int checkUidPermission(String permission, int uid) { try { List<String> hints = PermissionManager.getPermissionDenialHints(); if (hints == null) { return AppGlobals.getPackageManager().checkUidPermission(permission, uid); } else { return AppGlobals.getPackageManager() .checkUidPermission(permission, uid); .checkUidPermissionWithDenialHintForwarding(permission, uid, hints); } } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } Loading core/java/android/app/ContextImpl.java +45 −19 Original line number Diff line number Diff line Loading @@ -68,6 +68,7 @@ import android.os.Trace; import android.os.UserHandle; import android.os.UserManager; import android.os.storage.StorageManager; import android.permission.PermissionManager; import android.system.ErrnoException; import android.system.Os; import android.system.OsConstants; Loading Loading @@ -98,6 +99,7 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.nio.ByteOrder; import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.concurrent.Executor; Loading Loading @@ -1828,11 +1830,17 @@ class ContextImpl extends Context { } Slog.w(TAG, "Missing ActivityManager; assuming " + uid + " does not hold " + permission); PermissionManager.addPermissionDenialHint("Missing ActivityManager"); return PackageManager.PERMISSION_DENIED; } try { List<String> hints = PermissionManager.getPermissionDenialHints(); if (hints == null) { return am.checkPermission(permission, pid, uid); } else { return am.checkPermissionWithDenialHintForwarding(permission, pid, uid, hints); } } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } Loading Loading @@ -1889,43 +1897,61 @@ class ContextImpl extends Context { String permission, int resultOfCheck, boolean selfToo, int uid, String message) { if (resultOfCheck != PackageManager.PERMISSION_GRANTED) { List<String> hints = PermissionManager.getPermissionDenialHints(); throw new SecurityException( (message != null ? (message + ": ") : "") + (selfToo ? "Neither user " + uid + " nor current process has " : "uid " + uid + " does not have ") + permission + "."); : "uid " + uid + " does not have ") + permission + "." + (hints == null ? "" : " Hints: " + hints)); } } @Override public void enforcePermission( String permission, int pid, int uid, String message) { List<String> prev = PermissionManager.collectPermissionDenialHints(this, uid); try { enforce(permission, checkPermission(permission, pid, uid), false, uid, message); } finally { PermissionManager.resetPermissionDenialHints(prev); } } @Override public void enforceCallingPermission(String permission, String message) { List<String> prev = PermissionManager.collectPermissionDenialHints(this, Binder.getCallingUid()); try { enforce(permission, checkCallingPermission(permission), false, Binder.getCallingUid(), message); } finally { PermissionManager.resetPermissionDenialHints(prev); } } @Override public void enforceCallingOrSelfPermission( String permission, String message) { List<String> prev = PermissionManager.collectPermissionDenialHints(this, Binder.getCallingUid()); try { enforce(permission, checkCallingOrSelfPermission(permission), true, Binder.getCallingUid(), message); } finally { PermissionManager.resetPermissionDenialHints(prev); } } @Override Loading core/java/android/app/IActivityManager.aidl +1 −0 Original line number Diff line number Diff line Loading @@ -194,6 +194,7 @@ interface IActivityManager { int getProcessLimit(); @UnsupportedAppUsage int checkPermission(in String permission, int pid, int uid); int checkPermissionWithDenialHintForwarding(in String permission, int pid, int uid, inout List<String> permissionDenialHints); int checkUriPermission(in Uri uri, int pid, int uid, int mode, int userId, in IBinder callerToken); void grantUriPermission(in IApplicationThread caller, in String targetPkg, in Uri uri, Loading core/java/android/app/LoadedApk.java +3 −4 Original line number Diff line number Diff line Loading @@ -1497,7 +1497,7 @@ public final class LoadedApk { private Intent mCurIntent; private final boolean mOrdered; private boolean mDispatched; private Throwable mPreviousRunStacktrace; // To investigate b/37809561. STOPSHIP remove. private boolean mRunCalled; public Args(Intent intent, int resultCode, String resultData, Bundle resultExtras, boolean ordered, boolean sticky, int sendingUser) { Loading Loading @@ -1525,13 +1525,12 @@ public final class LoadedApk { final Intent intent = mCurIntent; if (intent == null) { Log.wtf(TAG, "Null intent being dispatched, mDispatched=" + mDispatched + ": run() previously called at " + Log.getStackTraceString(mPreviousRunStacktrace)); + (mRunCalled ? ", run() has already been called" : "")); } mCurIntent = null; mDispatched = true; mPreviousRunStacktrace = new Throwable("Previous stacktrace"); mRunCalled = true; if (receiver == null || intent == null || mForgotten) { if (mRegistered && ordered) { if (ActivityThread.DEBUG_BROADCAST) Slog.i(ActivityThread.TAG, Loading core/java/android/app/SystemServiceRegistry.java +1 −1 Original line number Diff line number Diff line Loading @@ -618,7 +618,7 @@ final class SystemServiceRegistry { new CachedServiceFetcher<RcsManager>() { @Override public RcsManager createService(ContextImpl ctx) { return new RcsManager(); return new RcsManager(ctx.getOuterContext()); } }); Loading Loading
core/java/android/app/ActivityManager.java +12 −8 Original line number Diff line number Diff line Loading @@ -64,6 +64,7 @@ import android.os.ServiceManager; import android.os.SystemProperties; import android.os.UserHandle; import android.os.WorkSource; import android.permission.PermissionManager; import android.util.ArrayMap; import android.util.DisplayMetrics; import android.util.Singleton; Loading Loading @@ -3738,6 +3739,7 @@ public class ActivityManager { } // Isolated processes don't get any permissions. if (UserHandle.isIsolated(uid)) { PermissionManager.addPermissionDenialHint("uid " + uid + " is isolated"); return PackageManager.PERMISSION_DENIED; } // If there is a uid that owns whatever is being accessed, it has Loading @@ -3753,24 +3755,26 @@ public class ActivityManager { Slog.w(TAG, "Permission denied: checkComponentPermission() owningUid=" + owningUid, here); */ PermissionManager.addPermissionDenialHint( "Target is not exported. owningUid=" + owningUid); return PackageManager.PERMISSION_DENIED; } if (permission == null) { return PackageManager.PERMISSION_GRANTED; } try { return AppGlobals.getPackageManager() .checkUidPermission(permission, uid); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } return checkUidPermission(permission, uid); } /** @hide */ public static int checkUidPermission(String permission, int uid) { try { List<String> hints = PermissionManager.getPermissionDenialHints(); if (hints == null) { return AppGlobals.getPackageManager().checkUidPermission(permission, uid); } else { return AppGlobals.getPackageManager() .checkUidPermission(permission, uid); .checkUidPermissionWithDenialHintForwarding(permission, uid, hints); } } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } Loading
core/java/android/app/ContextImpl.java +45 −19 Original line number Diff line number Diff line Loading @@ -68,6 +68,7 @@ import android.os.Trace; import android.os.UserHandle; import android.os.UserManager; import android.os.storage.StorageManager; import android.permission.PermissionManager; import android.system.ErrnoException; import android.system.Os; import android.system.OsConstants; Loading Loading @@ -98,6 +99,7 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.nio.ByteOrder; import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.concurrent.Executor; Loading Loading @@ -1828,11 +1830,17 @@ class ContextImpl extends Context { } Slog.w(TAG, "Missing ActivityManager; assuming " + uid + " does not hold " + permission); PermissionManager.addPermissionDenialHint("Missing ActivityManager"); return PackageManager.PERMISSION_DENIED; } try { List<String> hints = PermissionManager.getPermissionDenialHints(); if (hints == null) { return am.checkPermission(permission, pid, uid); } else { return am.checkPermissionWithDenialHintForwarding(permission, pid, uid, hints); } } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } Loading Loading @@ -1889,43 +1897,61 @@ class ContextImpl extends Context { String permission, int resultOfCheck, boolean selfToo, int uid, String message) { if (resultOfCheck != PackageManager.PERMISSION_GRANTED) { List<String> hints = PermissionManager.getPermissionDenialHints(); throw new SecurityException( (message != null ? (message + ": ") : "") + (selfToo ? "Neither user " + uid + " nor current process has " : "uid " + uid + " does not have ") + permission + "."); : "uid " + uid + " does not have ") + permission + "." + (hints == null ? "" : " Hints: " + hints)); } } @Override public void enforcePermission( String permission, int pid, int uid, String message) { List<String> prev = PermissionManager.collectPermissionDenialHints(this, uid); try { enforce(permission, checkPermission(permission, pid, uid), false, uid, message); } finally { PermissionManager.resetPermissionDenialHints(prev); } } @Override public void enforceCallingPermission(String permission, String message) { List<String> prev = PermissionManager.collectPermissionDenialHints(this, Binder.getCallingUid()); try { enforce(permission, checkCallingPermission(permission), false, Binder.getCallingUid(), message); } finally { PermissionManager.resetPermissionDenialHints(prev); } } @Override public void enforceCallingOrSelfPermission( String permission, String message) { List<String> prev = PermissionManager.collectPermissionDenialHints(this, Binder.getCallingUid()); try { enforce(permission, checkCallingOrSelfPermission(permission), true, Binder.getCallingUid(), message); } finally { PermissionManager.resetPermissionDenialHints(prev); } } @Override Loading
core/java/android/app/IActivityManager.aidl +1 −0 Original line number Diff line number Diff line Loading @@ -194,6 +194,7 @@ interface IActivityManager { int getProcessLimit(); @UnsupportedAppUsage int checkPermission(in String permission, int pid, int uid); int checkPermissionWithDenialHintForwarding(in String permission, int pid, int uid, inout List<String> permissionDenialHints); int checkUriPermission(in Uri uri, int pid, int uid, int mode, int userId, in IBinder callerToken); void grantUriPermission(in IApplicationThread caller, in String targetPkg, in Uri uri, Loading
core/java/android/app/LoadedApk.java +3 −4 Original line number Diff line number Diff line Loading @@ -1497,7 +1497,7 @@ public final class LoadedApk { private Intent mCurIntent; private final boolean mOrdered; private boolean mDispatched; private Throwable mPreviousRunStacktrace; // To investigate b/37809561. STOPSHIP remove. private boolean mRunCalled; public Args(Intent intent, int resultCode, String resultData, Bundle resultExtras, boolean ordered, boolean sticky, int sendingUser) { Loading Loading @@ -1525,13 +1525,12 @@ public final class LoadedApk { final Intent intent = mCurIntent; if (intent == null) { Log.wtf(TAG, "Null intent being dispatched, mDispatched=" + mDispatched + ": run() previously called at " + Log.getStackTraceString(mPreviousRunStacktrace)); + (mRunCalled ? ", run() has already been called" : "")); } mCurIntent = null; mDispatched = true; mPreviousRunStacktrace = new Throwable("Previous stacktrace"); mRunCalled = true; if (receiver == null || intent == null || mForgotten) { if (mRegistered && ordered) { if (ActivityThread.DEBUG_BROADCAST) Slog.i(ActivityThread.TAG, Loading
core/java/android/app/SystemServiceRegistry.java +1 −1 Original line number Diff line number Diff line Loading @@ -618,7 +618,7 @@ final class SystemServiceRegistry { new CachedServiceFetcher<RcsManager>() { @Override public RcsManager createService(ContextImpl ctx) { return new RcsManager(); return new RcsManager(ctx.getOuterContext()); } }); Loading