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

Commit 79aabce0 authored by Nate Myren's avatar Nate Myren Committed by Android Build Coastguard Worker
Browse files

Store trusted AttributionSources without token

Storing them with token means that there is a strong reference to the
token, preventing the WeakHashMap from properly purging values

This CP also includes changeID I5731ceeab5b9d0c72ce0131e2c9ba2f74558218c

Bug: 298253183
Test: manual (for WeakHashMap ejection)
      atest CtsAttributionSourceTestCases
(cherry picked from commit ed57878c)
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:c5127b478d0b1e72aa60783fcb4f1f1254d01075)
Merged-In: Ie92b76ec83552cebb419318c214057f1ea8455d2
Change-Id: Ie92b76ec83552cebb419318c214057f1ea8455d2
parent 50d69832
Loading
Loading
Loading
Loading
+24 −7
Original line number Diff line number Diff line
@@ -211,6 +211,11 @@ public final class AttributionSource implements Parcelable {
                token, mAttributionSourceState.renouncedPermissions, getNext());
    }

    /** @hide */
    public AttributionSource withDefaultToken() {
        return withToken(sDefaultToken);
    }

    /** @hide */
    public AttributionSource withPid(int pid) {
        return new AttributionSource(getUid(), pid, getPackageName(), getAttributionTag(),
@@ -520,16 +525,28 @@ public final class AttributionSource implements Parcelable {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        AttributionSource that = (AttributionSource) o;
        return mAttributionSourceState.uid == that.mAttributionSourceState.uid
        return equalsExceptToken(that) && Objects.equals(
                mAttributionSourceState.token, that.mAttributionSourceState.token);
    }

    /**
     * We store trusted attribution sources without their token (the token is the key to the map)
     * to avoid having a strong reference to the token. This means, when checking the equality of a
     * supplied AttributionSource in PermissionManagerService.isTrustedAttributionSource, we want to
     * compare everything except the token.
     *
     * @hide
     */
    public boolean equalsExceptToken(@Nullable AttributionSource o) {
        if (o == null) return false;
        return mAttributionSourceState.uid == o.mAttributionSourceState.uid
                && Objects.equals(mAttributionSourceState.packageName,
                        that.mAttributionSourceState.packageName)
                o.mAttributionSourceState.packageName)
                && Objects.equals(mAttributionSourceState.attributionTag,
                        that.mAttributionSourceState.attributionTag)
                && Objects.equals(mAttributionSourceState.token,
                        that.mAttributionSourceState.token)
                o.mAttributionSourceState.attributionTag)
                && Arrays.equals(mAttributionSourceState.renouncedPermissions,
                        that.mAttributionSourceState.renouncedPermissions)
                && Objects.equals(getNext(), that.getNext());
                o.mAttributionSourceState.renouncedPermissions)
                && Objects.equals(getNext(), o.getNext());
    }

    @Override
+4 −2
Original line number Diff line number Diff line
@@ -1001,7 +1001,9 @@ public class PermissionManagerService extends IPermissionManager.Stub {
            }

            synchronized (mLock) {
                mAttributions.put(source.getToken(), source);
                // Change the token for the AttributionSource we're storing, so that we don't store
                // a strong reference to the original token inside the map itself.
                mAttributions.put(source.getToken(), source.withDefaultToken());
            }
        }

@@ -1009,7 +1011,7 @@ public class PermissionManagerService extends IPermissionManager.Stub {
            synchronized (mLock) {
                final AttributionSource cachedSource = mAttributions.get(source.getToken());
                if (cachedSource != null) {
                    return cachedSource.equals(source);
                    return cachedSource.equalsExceptToken(source);
                }
                return false;
            }