diff --git a/core/java/android/net/NetworkCapabilities.java b/core/java/android/net/NetworkCapabilities.java index 116e343ff2..7d8df6a8ff 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 deae459e39..b89b1eb9c8 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -1666,7 +1666,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; } @@ -1727,7 +1727,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); @@ -7864,7 +7864,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); } @@ -7911,8 +7911,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 c21772a5d1..a5a4fa56ad 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -6851,7 +6851,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, @@ -6873,7 +6873,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, @@ -6926,7 +6926,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; })); } @@ -6947,7 +6947,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; })); }