diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-10-14 20:41:52 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-10-14 20:41:52 +0000 |
commit | b2ca4b47ba99ecbef7cd21244f4de78a26d2b441 (patch) | |
tree | 6530771f1a44c1c1aaf12a9af7d1b61bb0ffde99 | |
parent | 67808b9f03a7d9762fb425682d3a8a153ee3928d (diff) | |
parent | 104e41fae9e9cc5737ecd1328d2363e5708e3f9b (diff) | |
download | netd-android-vts-13.0_r4.tar.gz |
Snap for 9174844 from 104e41fae9e9cc5737ecd1328d2363e5708e3f9b to android13-tests-releaseandroid-vts-13.0_r8android-vts-13.0_r7android-vts-13.0_r6android-vts-13.0_r5android-vts-13.0_r4android-vts-13.0_r3android-vts-13.0_r2android-cts-13.0_r8android-cts-13.0_r7android-cts-13.0_r6android-cts-13.0_r5android-cts-13.0_r4android-cts-13.0_r3android13-tests-release
Change-Id: Ib2fcc705ab1270b7cf479b6649431aed2deae148
-rw-r--r-- | server/Network.cpp | 8 | ||||
-rw-r--r-- | server/Network.h | 2 | ||||
-rw-r--r-- | server/PhysicalNetwork.cpp | 2 | ||||
-rw-r--r-- | server/UidRanges.cpp | 19 | ||||
-rw-r--r-- | server/UidRanges.h | 4 | ||||
-rw-r--r-- | server/UnreachableNetwork.cpp | 2 | ||||
-rw-r--r-- | server/VirtualNetwork.cpp | 2 | ||||
-rw-r--r-- | tests/binder_test.cpp | 22 |
8 files changed, 12 insertions, 49 deletions
diff --git a/server/Network.cpp b/server/Network.cpp index 85f942f4..156cfb3e 100644 --- a/server/Network.cpp +++ b/server/Network.cpp @@ -117,18 +117,12 @@ void Network::removeFromUidRangeMap(const UidRanges& uidRanges, int32_t subPrior } } -bool Network::canAddUidRanges(const UidRanges& uidRanges, int32_t subPriority) const { +bool Network::canAddUidRanges(const UidRanges& uidRanges) const { if (uidRanges.overlapsSelf()) { ALOGE("uid range %s overlaps self", uidRanges.toString().c_str()); return false; } - auto iter = mUidRangeMap.find(subPriority); - if (iter != mUidRangeMap.end() && uidRanges.overlaps(iter->second)) { - ALOGE("uid range %s overlaps priority %d %s", uidRanges.toString().c_str(), subPriority, - iter->second.toString().c_str()); - return false; - } return true; } diff --git a/server/Network.h b/server/Network.h index e18e1cdb..dfead177 100644 --- a/server/Network.h +++ b/server/Network.h @@ -65,7 +65,7 @@ public: protected: explicit Network(unsigned netId, bool secure = false); - bool canAddUidRanges(const UidRanges& uidRanges, int32_t subPriority) const; + bool canAddUidRanges(const UidRanges& uidRanges) const; const unsigned mNetId; std::set<std::string> mInterfaces; diff --git a/server/PhysicalNetwork.cpp b/server/PhysicalNetwork.cpp index bb3f653d..68130641 100644 --- a/server/PhysicalNetwork.cpp +++ b/server/PhysicalNetwork.cpp @@ -165,7 +165,7 @@ int PhysicalNetwork::removeAsDefault() { } int PhysicalNetwork::addUsers(const UidRanges& uidRanges, int32_t subPriority) { - if (!isValidSubPriority(subPriority) || !canAddUidRanges(uidRanges, subPriority)) { + if (!isValidSubPriority(subPriority) || !canAddUidRanges(uidRanges)) { return -EINVAL; } diff --git a/server/UidRanges.cpp b/server/UidRanges.cpp index c90f30b9..765df322 100644 --- a/server/UidRanges.cpp +++ b/server/UidRanges.cpp @@ -145,25 +145,6 @@ bool UidRanges::overlapsSelf() const { return false; } -// std::binary_search cannot do partial match. For example, an uid range x-y not only overlaps with -// x-y, but also w-x, y-z, w-z, ...etc. Therefore, we need a specialized binary search. -bool UidRanges::overlaps(const UidRanges& other) const { - for (const auto& target : other.getRanges()) { - int first = 0; - int end = mRanges.size() - 1; - - while (first <= end) { - int middle = (first + end) / 2; - if (isOverlapped(mRanges[middle], target)) return true; - if (compUidRangeParcel(mRanges[middle], target)) - first = middle + 1; - else - end = middle - 1; - } - } - return false; -} - std::string UidRanges::toString() const { std::string s("uids{ "); for (const auto &range : mRanges) { diff --git a/server/UidRanges.h b/server/UidRanges.h index 9123eb17..f20dc443 100644 --- a/server/UidRanges.h +++ b/server/UidRanges.h @@ -51,12 +51,10 @@ public: // check if 'mRanges' has uid overlap between elements. bool overlapsSelf() const; - // check if this object has uid overlap with the input object. - bool overlaps(const UidRanges& other) const; + bool empty() const { return mRanges.empty(); } private: - // Keep it sorted. The overlaps() implements binary search, which requires a sorted data. std::vector<UidRangeParcel> mRanges; }; diff --git a/server/UnreachableNetwork.cpp b/server/UnreachableNetwork.cpp index 68802251..dd6318c0 100644 --- a/server/UnreachableNetwork.cpp +++ b/server/UnreachableNetwork.cpp @@ -27,7 +27,7 @@ namespace net { UnreachableNetwork::UnreachableNetwork(unsigned netId) : Network(netId) {} int UnreachableNetwork::addUsers(const UidRanges& uidRanges, int32_t subPriority) { - if (!isValidSubPriority(subPriority) || !canAddUidRanges(uidRanges, subPriority)) { + if (!isValidSubPriority(subPriority) || !canAddUidRanges(uidRanges)) { return -EINVAL; } diff --git a/server/VirtualNetwork.cpp b/server/VirtualNetwork.cpp index 495fd161..e0f60407 100644 --- a/server/VirtualNetwork.cpp +++ b/server/VirtualNetwork.cpp @@ -33,7 +33,7 @@ VirtualNetwork::VirtualNetwork(unsigned netId, bool secure, bool excludeLocalRou VirtualNetwork::~VirtualNetwork() {} int VirtualNetwork::addUsers(const UidRanges& uidRanges, int32_t subPriority) { - if (!isValidSubPriority(subPriority) || !canAddUidRanges(uidRanges, subPriority)) { + if (!isValidSubPriority(subPriority) || !canAddUidRanges(uidRanges)) { return -EINVAL; } diff --git a/tests/binder_test.cpp b/tests/binder_test.cpp index bc1e7393..cb70fe31 100644 --- a/tests/binder_test.cpp +++ b/tests/binder_test.cpp @@ -3982,7 +3982,7 @@ void expectUnreachableError(uid_t uid, unsigned netId, int selectionMode) { } // namespace -// Verify whether API reject overlapped UID ranges +// Verify how the API handle overlapped UID ranges TEST_F(NetdBinderTest, PerAppDefaultNetwork_OverlappedUidRanges) { const auto& config = makeNativeNetworkConfig(APP_DEFAULT_NETID, NativeNetworkType::PHYSICAL, INetd::PERMISSION_NONE, false, false); @@ -3996,28 +3996,23 @@ TEST_F(NetdBinderTest, PerAppDefaultNetwork_OverlappedUidRanges) { binder::Status status; status = mNetd->networkAddUidRanges(APP_DEFAULT_NETID, {makeUidRangeParcel(BASE_UID + 1, BASE_UID + 1)}); - EXPECT_FALSE(status.isOk()); - EXPECT_EQ(EINVAL, status.serviceSpecificErrorCode()); + EXPECT_TRUE(status.isOk()); status = mNetd->networkAddUidRanges(APP_DEFAULT_NETID, {makeUidRangeParcel(BASE_UID + 9, BASE_UID + 10)}); - EXPECT_FALSE(status.isOk()); - EXPECT_EQ(EINVAL, status.serviceSpecificErrorCode()); + EXPECT_TRUE(status.isOk()); status = mNetd->networkAddUidRanges(APP_DEFAULT_NETID, {makeUidRangeParcel(BASE_UID + 11, BASE_UID + 11)}); - EXPECT_FALSE(status.isOk()); - EXPECT_EQ(EINVAL, status.serviceSpecificErrorCode()); + EXPECT_TRUE(status.isOk()); status = mNetd->networkAddUidRanges(APP_DEFAULT_NETID, {makeUidRangeParcel(BASE_UID + 12, BASE_UID + 13)}); - EXPECT_FALSE(status.isOk()); - EXPECT_EQ(EINVAL, status.serviceSpecificErrorCode()); + EXPECT_TRUE(status.isOk()); status = mNetd->networkAddUidRanges(APP_DEFAULT_NETID, {makeUidRangeParcel(BASE_UID + 9, BASE_UID + 13)}); - EXPECT_FALSE(status.isOk()); - EXPECT_EQ(EINVAL, status.serviceSpecificErrorCode()); + EXPECT_TRUE(status.isOk()); std::vector<UidRangeParcel> selfOverlappedUidRanges = { makeUidRangeParcel(BASE_UID + 20, BASE_UID + 20), @@ -4410,11 +4405,6 @@ TEST_F(NetdBinderTest, UidRangeSubPriority_ValidateInputs) { uidRangeConfig.subPriority = SUB_PRIORITY_2; EXPECT_TRUE(mNetd->networkAddUidRangesParcel(uidRangeConfig).isOk()); - // For a single network, identical UID ranges with the same priority is invalid. - status = mNetd->networkAddUidRangesParcel(uidRangeConfig); - EXPECT_FALSE(status.isOk()); - EXPECT_EQ(EINVAL, status.serviceSpecificErrorCode()); - // Overlapping ranges is invalid. uidRangeConfig.uidRanges = {makeUidRangeParcel(BASE_UID + 1, BASE_UID + 1), makeUidRangeParcel(BASE_UID + 1, BASE_UID + 1)}; |