OSDN Git Service

Some networks may have null ifaces, I guess?
authorJeff Sharkey <jsharkey@android.com>
Thu, 14 Aug 2014 19:55:00 +0000 (12:55 -0700)
committerJeff Sharkey <jsharkey@google.com>
Thu, 14 Aug 2014 22:42:27 +0000 (22:42 +0000)
Seems like a bug further upstream, but guard ourselves against it
for now.

Bug: 17033841
Change-Id: Id0e5895c3389b63d4e34b1fb064efef8b72cd609

core/java/android/net/LinkProperties.java
core/java/com/android/internal/os/BatteryStatsImpl.java
services/core/java/com/android/server/net/NetworkPolicyManagerService.java
services/core/java/com/android/server/net/NetworkStatsService.java

index 47b74ab..6160bc2 100644 (file)
@@ -17,6 +17,7 @@
 package android.net;
 
 import android.annotation.NonNull;
+import android.annotation.Nullable;
 import android.net.ProxyInfo;
 import android.os.Parcelable;
 import android.os.Parcel;
@@ -124,7 +125,7 @@ public final class LinkProperties implements Parcelable {
      *
      * @return The interface name set for this link or {@code null}.
      */
-    public String getInterfaceName() {
+    public @Nullable String getInterfaceName() {
         return mIfaceName;
     }
 
index ee0d14b..a745b20 100644 (file)
@@ -45,6 +45,7 @@ import android.telephony.DataConnectionRealTimeInfo;
 import android.telephony.ServiceState;
 import android.telephony.SignalStrength;
 import android.telephony.TelephonyManager;
+import android.text.TextUtils;
 import android.util.ArrayMap;
 import android.util.Log;
 import android.util.LogWriter;
@@ -3744,6 +3745,7 @@ public final class BatteryStatsImpl extends BatteryStats {
     }
 
     public void noteNetworkInterfaceTypeLocked(String iface, int networkType) {
+        if (TextUtils.isEmpty(iface)) return;
         if (ConnectivityManager.isNetworkTypeMobile(networkType)) {
             mMobileIfaces = includeInStringArray(mMobileIfaces, iface);
             if (DEBUG) Slog.d(TAG, "Note mobile iface " + iface + ": " + mMobileIfaces);
index ad2bb92..bb5243c 100644 (file)
@@ -1060,9 +1060,11 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
                 final NetworkIdentity ident = NetworkIdentity.buildNetworkIdentity(mContext, state);
 
                 final String baseIface = state.linkProperties.getInterfaceName();
-                connIdents.add(Pair.create(baseIface, ident));
-                if (powerSave) {
-                    connIfaces.add(baseIface);
+                if (baseIface != null) {
+                    connIdents.add(Pair.create(baseIface, ident));
+                    if (powerSave) {
+                        connIfaces.add(baseIface);
+                    }
                 }
 
                 // Stacked interfaces are considered to have same identity as
@@ -1070,9 +1072,11 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
                 final List<LinkProperties> stackedLinks = state.linkProperties.getStackedLinks();
                 for (LinkProperties stackedLink : stackedLinks) {
                     final String stackedIface = stackedLink.getInterfaceName();
-                    connIdents.add(Pair.create(stackedIface, ident));
-                    if (powerSave) {
-                        connIfaces.add(stackedIface);
+                    if (stackedIface != null) {
+                        connIdents.add(Pair.create(stackedIface, ident));
+                        if (powerSave) {
+                            connIfaces.add(stackedIface);
+                        }
                     }
                 }
             }
index e35ca46..f995dee 100644 (file)
@@ -896,10 +896,12 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
                 // Traffic occurring on the base interface is always counted for
                 // both total usage and UID details.
                 final String baseIface = state.linkProperties.getInterfaceName();
-                findOrCreateNetworkIdentitySet(mActiveIfaces, baseIface).add(ident);
-                findOrCreateNetworkIdentitySet(mActiveUidIfaces, baseIface).add(ident);
-                if (isMobile) {
-                    mobileIfaces.add(baseIface);
+                if (baseIface != null) {
+                    findOrCreateNetworkIdentitySet(mActiveIfaces, baseIface).add(ident);
+                    findOrCreateNetworkIdentitySet(mActiveUidIfaces, baseIface).add(ident);
+                    if (isMobile) {
+                        mobileIfaces.add(baseIface);
+                    }
                 }
 
                 // Traffic occurring on stacked interfaces is usually clatd,
@@ -909,15 +911,16 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
                 final List<LinkProperties> stackedLinks = state.linkProperties.getStackedLinks();
                 for (LinkProperties stackedLink : stackedLinks) {
                     final String stackedIface = stackedLink.getInterfaceName();
-                    findOrCreateNetworkIdentitySet(mActiveUidIfaces, stackedIface).add(ident);
-                    if (isMobile) {
-                        mobileIfaces.add(stackedIface);
+                    if (stackedIface != null) {
+                        findOrCreateNetworkIdentitySet(mActiveUidIfaces, stackedIface).add(ident);
+                        if (isMobile) {
+                            mobileIfaces.add(stackedIface);
+                        }
                     }
                 }
             }
         }
 
-        mobileIfaces.remove(null);
         mMobileIfaces = mobileIfaces.toArray(new String[mobileIfaces.size()]);
     }