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

Commit 1ec11eb5 authored by Lorenzo Colitti's avatar Lorenzo Colitti
Browse files

Unbreak unregisterNetworkCallback.

http://ag/1194313 broke unregisterNetworkCallback because the
system does not parcel the type of the request back to the app.
So when the app calls unregisterNetworkCallback, the
NetworkRequest that's passed in does not have a type and thus
doesn't match the request in mNetworkRequests.

Fix this by parceling over the type as well.

This was not caught by the unit test because the unit test all
runs in the same process with no parceling.

Bug: 23113288
Change-Id: I58b2ed651b9bf5cbdcca5b25c3ca24db53cffdf1
parent 2573d83f
Loading
Loading
Loading
Loading
+7 −8
Original line number Original line Diff line number Diff line
@@ -19,6 +19,8 @@ package android.net;
import android.os.Parcel;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.Parcelable;


import java.util.Objects;

/**
/**
 * Defines a request for a network, made through {@link NetworkRequest.Builder} and used
 * Defines a request for a network, made through {@link NetworkRequest.Builder} and used
 * to request a network via {@link ConnectivityManager#requestNetwork} or listen for changes
 * to request a network via {@link ConnectivityManager#requestNetwork} or listen for changes
@@ -264,7 +266,7 @@ public class NetworkRequest implements Parcelable {
        dest.writeParcelable(networkCapabilities, flags);
        dest.writeParcelable(networkCapabilities, flags);
        dest.writeInt(legacyType);
        dest.writeInt(legacyType);
        dest.writeInt(requestId);
        dest.writeInt(requestId);
        // type intentionally not preserved across process boundaries.
        dest.writeString(type.name());
    }
    }
    public static final Creator<NetworkRequest> CREATOR =
    public static final Creator<NetworkRequest> CREATOR =
        new Creator<NetworkRequest>() {
        new Creator<NetworkRequest>() {
@@ -272,8 +274,8 @@ public class NetworkRequest implements Parcelable {
                NetworkCapabilities nc = (NetworkCapabilities)in.readParcelable(null);
                NetworkCapabilities nc = (NetworkCapabilities)in.readParcelable(null);
                int legacyType = in.readInt();
                int legacyType = in.readInt();
                int requestId = in.readInt();
                int requestId = in.readInt();
                // type intentionally not preserved across process boundaries.
                Type type = Type.valueOf(in.readString());  // IllegalArgumentException if invalid.
                NetworkRequest result = new NetworkRequest(nc, legacyType, requestId, Type.NONE);
                NetworkRequest result = new NetworkRequest(nc, legacyType, requestId, type);
                return result;
                return result;
            }
            }
            public NetworkRequest[] newArray(int size) {
            public NetworkRequest[] newArray(int size) {
@@ -311,13 +313,10 @@ public class NetworkRequest implements Parcelable {
        return (that.legacyType == this.legacyType &&
        return (that.legacyType == this.legacyType &&
                that.requestId == this.requestId &&
                that.requestId == this.requestId &&
                that.type == this.type &&
                that.type == this.type &&
                ((that.networkCapabilities == null && this.networkCapabilities == null) ||
                Objects.equals(that.networkCapabilities, this.networkCapabilities));
                 (that.networkCapabilities != null &&
                  that.networkCapabilities.equals(this.networkCapabilities))));
    }
    }


    public int hashCode() {
    public int hashCode() {
        return requestId + (legacyType * 1013) +
        return Objects.hash(requestId, legacyType, networkCapabilities, type);
                (networkCapabilities.hashCode() * 1051) + type.hashCode() * 17;
    }
    }
}
}
+10 −9
Original line number Original line Diff line number Diff line
@@ -3818,6 +3818,13 @@ public class ConnectivityService extends IConnectivityManager.Stub
        }
        }
    }
    }


    private void ensureNetworkRequestHasType(NetworkRequest request) {
        if (request.type == NetworkRequest.Type.NONE) {
            throw new IllegalArgumentException(
                    "All NetworkRequests in ConnectivityService must have a type");
        }
    }

    /**
    /**
     * Tracks info about the requester.
     * Tracks info about the requester.
     * Also used to notice when the calling process dies so we can self-expire
     * Also used to notice when the calling process dies so we can self-expire
@@ -3833,7 +3840,7 @@ public class ConnectivityService extends IConnectivityManager.Stub


        NetworkRequestInfo(NetworkRequest r, PendingIntent pi) {
        NetworkRequestInfo(NetworkRequest r, PendingIntent pi) {
            request = r;
            request = r;
            ensureRequestHasType();
            ensureNetworkRequestHasType(request);
            mPendingIntent = pi;
            mPendingIntent = pi;
            messenger = null;
            messenger = null;
            mBinder = null;
            mBinder = null;
@@ -3846,7 +3853,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
            super();
            super();
            messenger = m;
            messenger = m;
            request = r;
            request = r;
            ensureRequestHasType();
            ensureNetworkRequestHasType(request);
            mBinder = binder;
            mBinder = binder;
            mPid = getCallingPid();
            mPid = getCallingPid();
            mUid = getCallingUid();
            mUid = getCallingUid();
@@ -3860,13 +3867,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
            }
            }
        }
        }


        private void ensureRequestHasType() {
            if (request.type == NetworkRequest.Type.NONE) {
                throw new IllegalArgumentException(
                        "All NetworkRequests in ConnectivityService must have a type");
            }
        }

        private void enforceRequestCountLimit() {
        private void enforceRequestCountLimit() {
            synchronized (mUidToNetworkRequestCount) {
            synchronized (mUidToNetworkRequestCount) {
                int networkRequests = mUidToNetworkRequestCount.get(mUid, 0) + 1;
                int networkRequests = mUidToNetworkRequestCount.get(mUid, 0) + 1;
@@ -4117,6 +4117,7 @@ public class ConnectivityService extends IConnectivityManager.Stub


    @Override
    @Override
    public void releaseNetworkRequest(NetworkRequest networkRequest) {
    public void releaseNetworkRequest(NetworkRequest networkRequest) {
        ensureNetworkRequestHasType(networkRequest);
        mHandler.sendMessage(mHandler.obtainMessage(EVENT_RELEASE_NETWORK_REQUEST, getCallingUid(),
        mHandler.sendMessage(mHandler.obtainMessage(EVENT_RELEASE_NETWORK_REQUEST, getCallingUid(),
                0, networkRequest));
                0, networkRequest));
    }
    }