summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/ConnectivityService.java26
-rw-r--r--wifi/java/android/net/wifi/WifiManager.java12
2 files changed, 35 insertions, 3 deletions
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 9ec1c6a..7d8e9de 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -3518,10 +3518,34 @@ public class ConnectivityService extends IConnectivityManager.Stub
getCallingUid(), 0, operation));
}
+ // In order to implement the compatibility measure for pre-M apps that call
+ // WifiManager.enableNetwork(..., true) without also binding to that network explicitly,
+ // WifiManager registers a network listen for the purpose of calling setProcessDefaultNetwork.
+ // This ensures it has permission to do so.
+ private boolean hasWifiNetworkListenPermission(NetworkCapabilities nc) {
+ if (nc == null) {
+ return false;
+ }
+ int[] transportTypes = nc.getTransportTypes();
+ if (transportTypes.length != 1 || transportTypes[0] != NetworkCapabilities.TRANSPORT_WIFI) {
+ return false;
+ }
+ try {
+ mContext.enforceCallingOrSelfPermission(
+ android.Manifest.permission.ACCESS_WIFI_STATE,
+ "ConnectivityService");
+ } catch (SecurityException e) {
+ return false;
+ }
+ return true;
+ }
+
@Override
public NetworkRequest listenForNetwork(NetworkCapabilities networkCapabilities,
Messenger messenger, IBinder binder) {
- enforceAccessPermission();
+ if (!hasWifiNetworkListenPermission(networkCapabilities)) {
+ enforceAccessPermission();
+ }
NetworkRequest networkRequest = new NetworkRequest(new NetworkCapabilities(
networkCapabilities), TYPE_NONE, nextNetworkRequestId());
diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java
index 0f7dd61..3205351 100644
--- a/wifi/java/android/net/wifi/WifiManager.java
+++ b/wifi/java/android/net/wifi/WifiManager.java
@@ -2063,7 +2063,11 @@ public class WifiManager {
.removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.build();
mNetworkCallback = new PinningNetworkCallback();
- sCM.registerNetworkCallback(request, mNetworkCallback);
+ try {
+ sCM.registerNetworkCallback(request, mNetworkCallback);
+ } catch (SecurityException e) {
+ Log.d(TAG, "Failed to register network callback", e);
+ }
}
}
}
@@ -2072,7 +2076,11 @@ public class WifiManager {
initConnectivityManager();
synchronized (sCM) {
if (mNetworkCallback != null) {
- sCM.unregisterNetworkCallback(mNetworkCallback);
+ try {
+ sCM.unregisterNetworkCallback(mNetworkCallback);
+ } catch (SecurityException e) {
+ Log.d(TAG, "Failed to unregister network callback", e);
+ }
mNetworkCallback = null;
}
}