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

Commit d172594e authored by Dianne Hackborn's avatar Dianne Hackborn Committed by Android Git Automerger
Browse files

am cf6d2a1d: Merge "Fix issue #2845673: android:exported="false" is not obeyed" into gingerbread

Merge commit 'cf6d2a1d' into gingerbread-plus-aosp

* commit 'cf6d2a1d':
  Fix issue #2845673: android:exported="false" is not obeyed
parents 43647129 cf6d2a1d
Loading
Loading
Loading
Loading
+0 −4
Original line number Diff line number Diff line
@@ -3298,10 +3298,6 @@ public final class ActivityThread {
            Slog.e(TAG, "Failed to find provider info for " + name);
            return null;
        }
        if (holder.permissionFailure != null) {
            throw new SecurityException("Permission " + holder.permissionFailure
                    + " required for provider " + name);
        }

        IContentProvider prov = installProvider(context, holder.provider,
                holder.info, true);
+0 −10
Original line number Diff line number Diff line
@@ -326,19 +326,11 @@ public interface IActivityManager extends IInterface {
    /** Information you can retrieve about a particular application. */
    public static class ContentProviderHolder implements Parcelable {
        public final ProviderInfo info;
        public final String permissionFailure;
        public IContentProvider provider;
        public boolean noReleaseNeeded;

        public ContentProviderHolder(ProviderInfo _info) {
            info = _info;
            permissionFailure = null;
        }

        public ContentProviderHolder(ProviderInfo _info,
                String _permissionFailure) {
            info = _info;
            permissionFailure = _permissionFailure;
        }

        public int describeContents() {
@@ -347,7 +339,6 @@ public interface IActivityManager extends IInterface {

        public void writeToParcel(Parcel dest, int flags) {
            info.writeToParcel(dest, 0);
            dest.writeString(permissionFailure);
            if (provider != null) {
                dest.writeStrongBinder(provider.asBinder());
            } else {
@@ -369,7 +360,6 @@ public interface IActivityManager extends IInterface {

        private ContentProviderHolder(Parcel source) {
            info = ProviderInfo.CREATOR.createFromParcel(source);
            permissionFailure = source.readString();
            provider = ContentProviderNative.asInterface(
                source.readStrongBinder());
            noReleaseNeeded = source.readInt() != 0;
+6 −4
Original line number Diff line number Diff line
@@ -86,6 +86,7 @@ public abstract class ContentProvider implements ComponentCallbacks {
    private String mReadPermission;
    private String mWritePermission;
    private PathPermission[] mPathPermissions;
    private boolean mExported;

    private Transport mTransport = new Transport();

@@ -257,9 +258,9 @@ public abstract class ContentProvider implements ComponentCallbacks {
            final Context context = getContext();
            final String rperm = getReadPermission();
            final int pid = Binder.getCallingPid();
            if (rperm == null
            if (mExported && (rperm == null
                    || context.checkPermission(rperm, pid, uid)
                    == PackageManager.PERMISSION_GRANTED) {
                    == PackageManager.PERMISSION_GRANTED)) {
                return;
            }
            
@@ -303,9 +304,9 @@ public abstract class ContentProvider implements ComponentCallbacks {
            final Context context = getContext();
            final String wperm = getWritePermission();
            final int pid = Binder.getCallingPid();
            if (wperm == null
            if (mExported && (wperm == null
                    || context.checkPermission(wperm, pid, uid)
                    == PackageManager.PERMISSION_GRANTED) {
                    == PackageManager.PERMISSION_GRANTED)) {
                return true;
            }
            
@@ -786,6 +787,7 @@ public abstract class ContentProvider implements ComponentCallbacks {
                setReadPermission(info.readPermission);
                setWritePermission(info.writePermission);
                setPathPermissions(info.pathPermissions);
                mExported = info.exported;
            }
            ContentProvider.this.onCreate();
        }
+30 −17
Original line number Diff line number Diff line
@@ -1163,7 +1163,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
                    } catch (RemoteException e) {
                    }
                } catch (NameNotFoundException e) {
                    Log.w(TAG, "Unable to create context for heavy notification", e);
                    Slog.w(TAG, "Unable to create context for heavy notification", e);
                }
            } break;
            case CANCEL_HEAVY_NOTIFICATION_MSG: {
@@ -2368,7 +2368,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
            }
            
            if (proc == null) {
                Log.w(TAG, "crashApplication: nothing for uid=" + uid
                Slog.w(TAG, "crashApplication: nothing for uid=" + uid
                        + " initialPid=" + initialPid
                        + " packageName=" + packageName);
                return;
@@ -4054,6 +4054,9 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
                    return false;
                }
            }
            if (!pi.exported && pi.applicationInfo.uid != uid) {
                return false;
            }
            return true;
        } catch (RemoteException e) {
            return false;
@@ -4202,8 +4205,8 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
        if (perm == null) {
            perm = new UriPermission(targetUid, uri);
            targetUris.put(uri, perm);

        }

        perm.modeFlags |= modeFlags;
        if (activity == null) {
            perm.globalModeFlags |= modeFlags;
@@ -4224,6 +4227,11 @@ public final class ActivityManagerService extends ActivityManagerNative implemen

    void grantUriPermissionFromIntentLocked(int callingUid,
            String targetPkg, Intent intent, ActivityRecord activity) {
        if (DEBUG_URI_PERMISSION) Slog.v(TAG,
                "Grant URI perm to " + (intent != null ? intent.getData() : null)
                + " from " + intent + "; flags=0x"
                + Integer.toHexString(intent != null ? intent.getFlags() : 0));

        if (intent == null) {
            return;
        }
@@ -4902,13 +4910,12 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
    }

    private final String checkContentProviderPermissionLocked(
            ProviderInfo cpi, ProcessRecord r, int mode) {
            ProviderInfo cpi, ProcessRecord r) {
        final int callingPid = (r != null) ? r.pid : Binder.getCallingPid();
        final int callingUid = (r != null) ? r.info.uid : Binder.getCallingUid();
        if (checkComponentPermission(cpi.readPermission, callingPid, callingUid,
                cpi.exported ? -1 : cpi.applicationInfo.uid)
                == PackageManager.PERMISSION_GRANTED
                && mode == ParcelFileDescriptor.MODE_READ_ONLY || mode == -1) {
                == PackageManager.PERMISSION_GRANTED) {
            return null;
        }
        if (checkComponentPermission(cpi.writePermission, callingPid, callingUid,
@@ -4925,8 +4932,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
                PathPermission pp = pps[i];
                if (checkComponentPermission(pp.getReadPermission(), callingPid, callingUid,
                        cpi.exported ? -1 : cpi.applicationInfo.uid)
                        == PackageManager.PERMISSION_GRANTED
                        && mode == ParcelFileDescriptor.MODE_READ_ONLY || mode == -1) {
                        == PackageManager.PERMISSION_GRANTED) {
                    return null;
                }
                if (checkComponentPermission(pp.getWritePermission(), callingPid, callingUid,
@@ -4937,6 +4943,15 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
            }
        }
        
        HashMap<Uri, UriPermission> perms = mGrantedUriPermissions.get(callingUid);
        if (perms != null) {
            for (Map.Entry<Uri, UriPermission> uri : perms.entrySet()) {
                if (uri.getKey().getAuthority().equals(cpi.authority)) {
                    return null;
                }
            }
        }

        String msg = "Permission Denial: opening provider " + cpi.name
                + " from " + (r != null ? r : "(null)") + " (pid=" + callingPid
                + ", uid=" + callingUid + ") requires "
@@ -4966,10 +4981,9 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
            cpr = mProvidersByName.get(name);
            if (cpr != null) {
                cpi = cpr.info;
                if (checkContentProviderPermissionLocked(cpi, r, -1) != null) {
                    return new ContentProviderHolder(cpi,
                            cpi.readPermission != null
                                    ? cpi.readPermission : cpi.writePermission);
                String msg;
                if ((msg=checkContentProviderPermissionLocked(cpi, r)) != null) {
                    throw new SecurityException(msg);
                }

                if (r != null && cpr.canRunHere(r)) {
@@ -5029,10 +5043,9 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
                    return null;
                }

                if (checkContentProviderPermissionLocked(cpi, r, -1) != null) {
                    return new ContentProviderHolder(cpi,
                            cpi.readPermission != null
                                    ? cpi.readPermission : cpi.writePermission);
                String msg;
                if ((msg=checkContentProviderPermissionLocked(cpi, r)) != null) {
                    throw new SecurityException(msg);
                }

                if (!mSystemReady && !mDidUpdate && !mWaitingUpdate
@@ -6204,7 +6217,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
                Binder.restoreCallingIdentity(origId);
            }
            int res = result.get();
            Log.w(TAG, "handleApplicationStrictModeViolation; res=" + res);
            Slog.w(TAG, "handleApplicationStrictModeViolation; res=" + res);
        }
    }