From 5ab1f55d1f63318ec44d2c26995c75ed330c20e3 Mon Sep 17 00:00:00 2001 From: Cody Kesting Date: Mon, 16 Mar 2020 18:15:28 -0700 Subject: [PATCH] Change NetworkCapabilties administrator UIDs to be stored as int[]. NetworkCapabilities#mAdministratorUids is used to track the UIDs that are administrators of the given Network. This value was previously stored as List. However, general Android API Council guidelines recommend using Arrays for primitive values. In order to be consistent with the guidelines, updating the field to use an Array. Bug: 147903575 Test: atest FrameworksNetTests Change-Id: I2652a5b0f276b8944454af5cb4b1383a3e054cfa Merged-In: I2652a5b0f276b8944454af5cb4b1383a3e054cfa --- .../java/android/net/NetworkCapabilities.java | 32 ++++++++----------- .../android/server/ConnectivityService.java | 11 ++++--- .../android/server/TestNetworkService.java | 11 +------ .../server/ConnectivityServiceTest.java | 8 ++--- 4 files changed, 25 insertions(+), 37 deletions(-) diff --git a/core/java/android/net/NetworkCapabilities.java b/core/java/android/net/NetworkCapabilities.java index 5cc43e9239..ae5c24ecd7 100644 --- a/core/java/android/net/NetworkCapabilities.java +++ b/core/java/android/net/NetworkCapabilities.java @@ -37,9 +37,7 @@ import com.android.internal.util.Preconditions; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +import java.util.Arrays; import java.util.Objects; import java.util.Set; import java.util.StringJoiner; @@ -96,7 +94,7 @@ public final class NetworkCapabilities implements Parcelable { mTransportInfo = null; mSignalStrength = SIGNAL_STRENGTH_UNSPECIFIED; mUids = null; - mAdministratorUids.clear(); + mAdministratorUids = new int[0]; mOwnerUid = Process.INVALID_UID; mSSID = null; mPrivateDnsBroken = false; @@ -884,10 +882,10 @@ public final class NetworkCapabilities implements Parcelable { * empty unless the destination is 1) the System Server, or 2) Telephony. In either case, the * receiving entity must have the ACCESS_FINE_LOCATION permission and target R+. */ - private final List mAdministratorUids = new ArrayList<>(); + private int[] mAdministratorUids = new int[0]; /** - * Sets the list of UIDs that are administrators of this network. + * Sets the int[] of UIDs that are administrators of this network. * *

UIDs included in administratorUids gain administrator privileges over this Network. * Examples of UIDs that should be included in administratorUids are: @@ -907,23 +905,21 @@ public final class NetworkCapabilities implements Parcelable { */ @NonNull @SystemApi - public NetworkCapabilities setAdministratorUids( - @NonNull final List administratorUids) { - mAdministratorUids.clear(); - mAdministratorUids.addAll(administratorUids); + public NetworkCapabilities setAdministratorUids(@NonNull final int[] administratorUids) { + mAdministratorUids = Arrays.copyOf(administratorUids, administratorUids.length); return this; } /** - * Retrieves the list of UIDs that are administrators of this Network. + * Retrieves the UIDs that are administrators of this Network. * - * @return the List of UIDs that are administrators of this Network + * @return the int[] of UIDs that are administrators of this Network * @hide */ @NonNull @SystemApi - public List getAdministratorUids() { - return Collections.unmodifiableList(mAdministratorUids); + public int[] getAdministratorUids() { + return Arrays.copyOf(mAdministratorUids, mAdministratorUids.length); } /** @@ -1584,7 +1580,7 @@ public final class NetworkCapabilities implements Parcelable { dest.writeArraySet(mUids); dest.writeString(mSSID); dest.writeBoolean(mPrivateDnsBroken); - dest.writeList(mAdministratorUids); + dest.writeIntArray(mAdministratorUids); dest.writeInt(mOwnerUid); dest.writeInt(mRequestorUid); dest.writeString(mRequestorPackageName); @@ -1608,7 +1604,7 @@ public final class NetworkCapabilities implements Parcelable { null /* ClassLoader, null for default */); netCap.mSSID = in.readString(); netCap.mPrivateDnsBroken = in.readBoolean(); - netCap.setAdministratorUids(in.readArrayList(null)); + netCap.setAdministratorUids(in.createIntArray()); netCap.mOwnerUid = in.readInt(); netCap.mRequestorUid = in.readInt(); netCap.mRequestorPackageName = in.readString(); @@ -1665,8 +1661,8 @@ public final class NetworkCapabilities implements Parcelable { sb.append(" OwnerUid: ").append(mOwnerUid); } - if (!mAdministratorUids.isEmpty()) { - sb.append(" AdministratorUids: ").append(mAdministratorUids); + if (mAdministratorUids.length == 0) { + sb.append(" AdministratorUids: ").append(Arrays.toString(mAdministratorUids)); } if (null != mSSID) { diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index d14d98c914..32ff5290c6 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -1668,7 +1668,7 @@ public class ConnectivityService extends IConnectivityManager.Stub if (newNc.getNetworkSpecifier() != null) { newNc.setNetworkSpecifier(newNc.getNetworkSpecifier().redact()); } - newNc.setAdministratorUids(Collections.EMPTY_LIST); + newNc.setAdministratorUids(new int[0]); return newNc; } @@ -1729,7 +1729,7 @@ public class ConnectivityService extends IConnectivityManager.Stub nc.setSingleUid(callerUid); } nc.setRequestorUidAndPackageName(callerUid, callerPackageName); - nc.setAdministratorUids(Collections.EMPTY_LIST); + nc.setAdministratorUids(new int[0]); // Clear owner UID; this can never come from an app. nc.setOwnerUid(INVALID_UID); @@ -7857,7 +7857,7 @@ public class ConnectivityService extends IConnectivityManager.Stub private void clearNetworkCapabilitiesUids(@NonNull NetworkCapabilities nc) { nc.setUids(null); - nc.setAdministratorUids(Collections.EMPTY_LIST); + nc.setAdministratorUids(new int[0]); nc.setOwnerUid(Process.INVALID_UID); } @@ -7904,8 +7904,9 @@ public class ConnectivityService extends IConnectivityManager.Stub } // Administrator UIDs also contains the Owner UID - if (nai.networkCapabilities.getAdministratorUids().contains(callbackUid)) { - return true; + final int[] administratorUids = nai.networkCapabilities.getAdministratorUids(); + for (final int uid : administratorUids) { + if (uid == callbackUid) return true; } return false; diff --git a/services/core/java/com/android/server/TestNetworkService.java b/services/core/java/com/android/server/TestNetworkService.java index f772a4a5a3..81a1372eb1 100644 --- a/services/core/java/com/android/server/TestNetworkService.java +++ b/services/core/java/com/android/server/TestNetworkService.java @@ -53,7 +53,6 @@ import java.net.InterfaceAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.util.ArrayList; -import java.util.List; import java.util.Objects; import java.util.concurrent.atomic.AtomicInteger; @@ -250,7 +249,7 @@ class TestNetworkService extends ITestNetworkManager.Stub { nc.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED); nc.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED); nc.setNetworkSpecifier(new StringNetworkSpecifier(iface)); - nc.setAdministratorUids(intArrayToList(administratorUids)); + nc.setAdministratorUids(administratorUids); if (!isMetered) { nc.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED); } @@ -293,14 +292,6 @@ class TestNetworkService extends ITestNetworkManager.Stub { return new TestNetworkAgent(looper, context, ni, nc, lp, callingUid, binder); } - private List intArrayToList(@NonNull int[] array) { - final List list = new ArrayList<>(array.length); - for (final int i : array) { - list.add(i); - } - return list; - } - /** * Sets up a Network with extremely limited privileges, guarded by the MANAGE_TEST_NETWORKS * permission. diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index d8f32e1c45..b7751398f3 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -6847,7 +6847,7 @@ public class ConnectivityServiceTest { @Test public void testCheckConnectivityDiagnosticsPermissionsNetworkAdministrator() throws Exception { final NetworkCapabilities nc = new NetworkCapabilities(); - nc.setAdministratorUids(Arrays.asList(Process.myUid())); + nc.setAdministratorUids(new int[] {Process.myUid()}); final NetworkAgentInfo naiWithUid = new NetworkAgentInfo( null, null, null, null, null, nc, 0, mServiceContext, null, null, @@ -6869,7 +6869,7 @@ public class ConnectivityServiceTest { public void testCheckConnectivityDiagnosticsPermissionsFails() throws Exception { final NetworkCapabilities nc = new NetworkCapabilities(); nc.setOwnerUid(Process.myUid()); - nc.setAdministratorUids(Arrays.asList(Process.myUid())); + nc.setAdministratorUids(new int[] {Process.myUid()}); final NetworkAgentInfo naiWithUid = new NetworkAgentInfo( null, null, null, null, null, nc, 0, mServiceContext, null, null, @@ -6922,7 +6922,7 @@ public class ConnectivityServiceTest { argThat(report -> { final NetworkCapabilities nc = report.getNetworkCapabilities(); return nc.getUids() == null - && nc.getAdministratorUids().isEmpty() + && nc.getAdministratorUids().length == 0 && nc.getOwnerUid() == Process.INVALID_UID; })); } @@ -6943,7 +6943,7 @@ public class ConnectivityServiceTest { argThat(report -> { final NetworkCapabilities nc = report.getNetworkCapabilities(); return nc.getUids() == null - && nc.getAdministratorUids().isEmpty() + && nc.getAdministratorUids().length == 0 && nc.getOwnerUid() == Process.INVALID_UID; })); }