From 2d260e9e3576c742e61112111cd226d0a5d25ff3 Mon Sep 17 00:00:00 2001 From: Quang Anh Luong Date: Tue, 17 Dec 2024 18:30:16 +0900 Subject: [PATCH] Fix legacy tether behavior for duplicate requests Legacy duplicate tethering requests would restart tethering if a pending request existed that was different (via equals()) from the new request. However, this behavior existed before uid/package name was added to TetheringRequest#equals(), so we should use new method to check equality while ignoring uid/package name. Bug: 216524590 Test: atest TetheringTest TetheringManagerTest Change-Id: I962c7b4d8efc7f631077d6fa0f87f52ee779192e --- .../src/android/net/TetheringManager.java | 13 +++++++++++-- .../networkstack/tethering/Tethering.java | 2 +- .../networkstack/tethering/TetheringTest.java | 19 +++++++++++++++++-- 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/Tethering/common/TetheringLib/src/android/net/TetheringManager.java b/Tethering/common/TetheringLib/src/android/net/TetheringManager.java index 25bfb45aa6..e0ea0d493e 100644 --- a/Tethering/common/TetheringLib/src/android/net/TetheringManager.java +++ b/Tethering/common/TetheringLib/src/android/net/TetheringManager.java @@ -1187,6 +1187,17 @@ public class TetheringManager { public boolean equals(Object obj) { if (this == obj) return true; if (!(obj instanceof TetheringRequest otherRequest)) return false; + if (!equalsIgnoreUidPackage(otherRequest)) return false; + TetheringRequestParcel parcel = getParcel(); + TetheringRequestParcel otherParcel = otherRequest.getParcel(); + return parcel.uid == otherParcel.uid + && Objects.equals(parcel.packageName, otherParcel.packageName); + } + + /** + * @hide + */ + public boolean equalsIgnoreUidPackage(TetheringRequest otherRequest) { TetheringRequestParcel parcel = getParcel(); TetheringRequestParcel otherParcel = otherRequest.getParcel(); return parcel.tetheringType == otherParcel.tetheringType @@ -1196,8 +1207,6 @@ public class TetheringManager { && parcel.showProvisioningUi == otherParcel.showProvisioningUi && parcel.connectivityScope == otherParcel.connectivityScope && Objects.equals(parcel.softApConfig, otherParcel.softApConfig) - && parcel.uid == otherParcel.uid - && Objects.equals(parcel.packageName, otherParcel.packageName) && Objects.equals(parcel.interfaceName, otherParcel.interfaceName); } diff --git a/Tethering/src/com/android/networkstack/tethering/Tethering.java b/Tethering/src/com/android/networkstack/tethering/Tethering.java index 254b60fda3..a96f66c76c 100644 --- a/Tethering/src/com/android/networkstack/tethering/Tethering.java +++ b/Tethering/src/com/android/networkstack/tethering/Tethering.java @@ -664,7 +664,7 @@ public class Tethering { final TetheringRequest unfinishedRequest = mActiveTetheringRequests.get(type); // If tethering is already enabled with a different request, // disable before re-enabling. - if (unfinishedRequest != null && !unfinishedRequest.equals(request)) { + if (unfinishedRequest != null && !unfinishedRequest.equalsIgnoreUidPackage(request)) { enableTetheringInternal(type, false /* disabled */, unfinishedRequest.getInterfaceName(), null); mEntitlementMgr.stopProvisioningIfNeeded(type); diff --git a/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringTest.java b/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringTest.java index 0c6a95d3d1..e58a333a02 100644 --- a/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringTest.java +++ b/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringTest.java @@ -267,8 +267,9 @@ public class TetheringTest { private static final String TEST_P2P_REGEX = "test_p2p-p2p\\d-.*"; private static final String TEST_BT_REGEX = "test_pan\\d"; private static final int TEST_CALLER_UID = 1000; + private static final int TEST_CALLER_UID_2 = 2000; private static final String TEST_CALLER_PKG = "com.test.tethering"; - + private static final String TEST_CALLER_PKG_2 = "com.test.tethering2"; private static final int CELLULAR_NETID = 100; private static final int WIFI_NETID = 101; private static final int DUN_NETID = 102; @@ -785,7 +786,10 @@ public class TetheringTest { if (interfaceName != null) { builder.setInterfaceName(interfaceName); } - return builder.build(); + TetheringRequest request = builder.build(); + request.setUid(TEST_CALLER_UID); + request.setPackageName(TEST_CALLER_PKG); + return request; } @NonNull @@ -2786,6 +2790,17 @@ public class TetheringTest { verify(mUsbManager, never()).setCurrentFunctions(UsbManager.FUNCTION_NONE); reset(mUsbManager); + // Enable USB tethering again with the same request but different uid/package and expect no + // change to USB. + TetheringRequest differentUidPackage = createTetheringRequest(TETHERING_USB); + differentUidPackage.setUid(TEST_CALLER_UID_2); + differentUidPackage.setPackageName(TEST_CALLER_PKG_2); + mTethering.startTethering(differentUidPackage, TEST_CALLER_PKG_2, secondResult); + mLooper.dispatchAll(); + secondResult.assertHasResult(); + verify(mUsbManager, never()).setCurrentFunctions(UsbManager.FUNCTION_NONE); + reset(mUsbManager); + // Enable USB tethering with a different request and expect that USB is stopped and // started. mTethering.startTethering(createTetheringRequest(TETHERING_USB,