diff options
| -rw-r--r-- | services/core/java/com/android/server/ConnectivityService.java | 26 | ||||
| -rw-r--r-- | wifi/java/android/net/wifi/WifiManager.java | 12 |
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; } } |
