From f6a1052f4e0387b8b95460feb221846d39cf0466 Mon Sep 17 00:00:00 2001 From: Tomasz Wasilczyk Date: Tue, 26 Jan 2021 08:46:14 -0800 Subject: [PATCH] Don't crash Tethering service when WiFi feature is missing Bug: 175430552 Test: disable WiFi feature on device with wlan0 Change-Id: I83012013ff6a276d9a5c70748b726289b007cb0a --- .../networkstack/tethering/Tethering.java | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/Tethering/src/com/android/networkstack/tethering/Tethering.java b/Tethering/src/com/android/networkstack/tethering/Tethering.java index 385c691025..ac5857d1c8 100644 --- a/Tethering/src/com/android/networkstack/tethering/Tethering.java +++ b/Tethering/src/com/android/networkstack/tethering/Tethering.java @@ -1689,12 +1689,14 @@ public class Tethering { // If this is a Wi-Fi interface, tell WifiManager of any errors // or the inactive serving state. if (who.interfaceType() == TETHERING_WIFI) { - if (who.lastError() != TETHER_ERROR_NO_ERROR) { - getWifiManager().updateInterfaceIpState( - who.interfaceName(), IFACE_IP_MODE_CONFIGURATION_ERROR); + final WifiManager mgr = getWifiManager(); + final String iface = who.interfaceName(); + if (mgr == null) { + Log.wtf(TAG, "Skipping WifiManager notification about inactive tethering"); + } else if (who.lastError() != TETHER_ERROR_NO_ERROR) { + mgr.updateInterfaceIpState(iface, IFACE_IP_MODE_CONFIGURATION_ERROR); } else { - getWifiManager().updateInterfaceIpState( - who.interfaceName(), IFACE_IP_MODE_UNSPECIFIED); + mgr.updateInterfaceIpState(iface, IFACE_IP_MODE_UNSPECIFIED); } } } @@ -2421,6 +2423,19 @@ public class Tethering { mLog.log(iface + " is not a tetherable iface, ignoring"); return; } + + final PackageManager pm = mContext.getPackageManager(); + if ((interfaceType == TETHERING_WIFI || interfaceType == TETHERING_WIGIG) + && !pm.hasSystemFeature(PackageManager.FEATURE_WIFI)) { + mLog.log(iface + " is not tetherable, because WiFi feature is disabled"); + return; + } + if (interfaceType == TETHERING_WIFI_P2P + && !pm.hasSystemFeature(PackageManager.FEATURE_WIFI_DIRECT)) { + mLog.log(iface + " is not tetherable, because WiFi Direct feature is disabled"); + return; + } + maybeTrackNewInterfaceLocked(iface, interfaceType); }