Enforce ConnectivityManager.releaseNetworkRequest callers own the NetworkRequest
Enforce that callers of ConnectivityManager.releaseNetworkRequest() are the creators of the NetworkRequest being released by matching UIDs. Change-Id: I439468c054bacc035e2db2c4967b24d183e78e9c
This commit is contained in:
@@ -409,7 +409,8 @@ public class ConnectivityService extends IConnectivityManager.Stub {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* used to remove a network request, either a listener or a real request
|
* used to remove a network request, either a listener or a real request
|
||||||
* includes a NetworkRequest
|
* arg1 = UID of caller
|
||||||
|
* obj = NetworkRequest
|
||||||
*/
|
*/
|
||||||
private static final int EVENT_RELEASE_NETWORK_REQUEST = 22;
|
private static final int EVENT_RELEASE_NETWORK_REQUEST = 22;
|
||||||
|
|
||||||
@@ -3333,10 +3334,15 @@ public class ConnectivityService extends IConnectivityManager.Stub {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void handleReleaseNetworkRequest(NetworkRequest request) {
|
private void handleReleaseNetworkRequest(NetworkRequest request, int callingUid) {
|
||||||
if (DBG) log("releasing NetworkRequest " + request);
|
NetworkRequestInfo nri = mNetworkRequests.get(request);
|
||||||
NetworkRequestInfo nri = mNetworkRequests.remove(request);
|
|
||||||
if (nri != null) {
|
if (nri != null) {
|
||||||
|
if (nri.mUid != callingUid) {
|
||||||
|
if (DBG) log("Attempt to release unowned NetworkRequest " + request);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (DBG) log("releasing NetworkRequest " + request);
|
||||||
|
mNetworkRequests.remove(request);
|
||||||
// tell the network currently servicing this that it's no longer interested
|
// tell the network currently servicing this that it's no longer interested
|
||||||
NetworkAgentInfo affectedNetwork = mNetworkForRequestId.get(nri.request.requestId);
|
NetworkAgentInfo affectedNetwork = mNetworkForRequestId.get(nri.request.requestId);
|
||||||
if (affectedNetwork != null) {
|
if (affectedNetwork != null) {
|
||||||
@@ -3482,7 +3488,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case EVENT_RELEASE_NETWORK_REQUEST: {
|
case EVENT_RELEASE_NETWORK_REQUEST: {
|
||||||
handleReleaseNetworkRequest((NetworkRequest) msg.obj);
|
handleReleaseNetworkRequest((NetworkRequest) msg.obj, msg.arg1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -5460,8 +5466,8 @@ public class ConnectivityService extends IConnectivityManager.Stub {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void releaseNetworkRequest(NetworkRequest networkRequest) {
|
public void releaseNetworkRequest(NetworkRequest networkRequest) {
|
||||||
mHandler.sendMessage(mHandler.obtainMessage(EVENT_RELEASE_NETWORK_REQUEST,
|
mHandler.sendMessage(mHandler.obtainMessage(EVENT_RELEASE_NETWORK_REQUEST, getCallingUid(),
|
||||||
networkRequest));
|
0, networkRequest));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
Reference in New Issue
Block a user