From 70964d3a1817a3584a1dfcd4916e4b544b639617 Mon Sep 17 00:00:00 2001 From: Lorenzo Colitti Date: Tue, 5 Jul 2016 01:22:13 +0900 Subject: [PATCH] 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 --- core/java/android/net/NetworkRequest.java | 15 +++++++-------- .../android/server/ConnectivityService.java | 19 ++++++++++--------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/core/java/android/net/NetworkRequest.java b/core/java/android/net/NetworkRequest.java index 5ac24d56cb..847d82bbd7 100644 --- a/core/java/android/net/NetworkRequest.java +++ b/core/java/android/net/NetworkRequest.java @@ -19,6 +19,8 @@ package android.net; import android.os.Parcel; import android.os.Parcelable; +import java.util.Objects; + /** * 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 @@ -264,7 +266,7 @@ public class NetworkRequest implements Parcelable { dest.writeParcelable(networkCapabilities, flags); dest.writeInt(legacyType); dest.writeInt(requestId); - // type intentionally not preserved across process boundaries. + dest.writeString(type.name()); } public static final Creator CREATOR = new Creator() { @@ -272,8 +274,8 @@ public class NetworkRequest implements Parcelable { NetworkCapabilities nc = (NetworkCapabilities)in.readParcelable(null); int legacyType = in.readInt(); int requestId = in.readInt(); - // type intentionally not preserved across process boundaries. - NetworkRequest result = new NetworkRequest(nc, legacyType, requestId, Type.NONE); + Type type = Type.valueOf(in.readString()); // IllegalArgumentException if invalid. + NetworkRequest result = new NetworkRequest(nc, legacyType, requestId, type); return result; } public NetworkRequest[] newArray(int size) { @@ -311,13 +313,10 @@ public class NetworkRequest implements Parcelable { return (that.legacyType == this.legacyType && that.requestId == this.requestId && that.type == this.type && - ((that.networkCapabilities == null && this.networkCapabilities == null) || - (that.networkCapabilities != null && - that.networkCapabilities.equals(this.networkCapabilities)))); + Objects.equals(that.networkCapabilities, this.networkCapabilities)); } public int hashCode() { - return requestId + (legacyType * 1013) + - (networkCapabilities.hashCode() * 1051) + type.hashCode() * 17; + return Objects.hash(requestId, legacyType, networkCapabilities, type); } } diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 7abb9671f9..69d0561aca 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -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. * 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) { request = r; - ensureRequestHasType(); + ensureNetworkRequestHasType(request); mPendingIntent = pi; messenger = null; mBinder = null; @@ -3846,7 +3853,7 @@ public class ConnectivityService extends IConnectivityManager.Stub super(); messenger = m; request = r; - ensureRequestHasType(); + ensureNetworkRequestHasType(request); mBinder = binder; mPid = getCallingPid(); 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() { synchronized (mUidToNetworkRequestCount) { int networkRequests = mUidToNetworkRequestCount.get(mUid, 0) + 1; @@ -4117,6 +4117,7 @@ public class ConnectivityService extends IConnectivityManager.Stub @Override public void releaseNetworkRequest(NetworkRequest networkRequest) { + ensureNetworkRequestHasType(networkRequest); mHandler.sendMessage(mHandler.obtainMessage(EVENT_RELEASE_NETWORK_REQUEST, getCallingUid(), 0, networkRequest)); }