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
This commit is contained in:
Lorenzo Colitti
2016-07-05 01:22:13 +09:00
parent 99236d14e3
commit 70964d3a18
2 changed files with 17 additions and 17 deletions

View File

@@ -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<NetworkRequest> CREATOR =
new Creator<NetworkRequest>() {
@@ -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);
}
}

View File

@@ -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));
}