From 4938d40501a72277c4e5f6e7cf3136bdee694b67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20=C5=BBenczykowski?= Date: Sun, 14 Aug 2022 14:36:20 +0000 Subject: [PATCH] simplify netd updatable MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Test: TreeHugger Signed-off-by: Maciej Żenczykowski Change-Id: I8987f33b3f3427683e5ae9b2931528f91d6f0aeb --- netd/BpfHandler.cpp | 15 ++++++++------- netd/NetdUpdatable.cpp | 27 ++++++--------------------- netd/NetdUpdatable.h | 37 ------------------------------------- 3 files changed, 14 insertions(+), 65 deletions(-) delete mode 100644 netd/NetdUpdatable.h diff --git a/netd/BpfHandler.cpp b/netd/BpfHandler.cpp index 2810d8086f..994db1d516 100644 --- a/netd/BpfHandler.cpp +++ b/netd/BpfHandler.cpp @@ -134,18 +134,16 @@ bool BpfHandler::hasUpdateDeviceStatsPermission(uid_t uid) { int BpfHandler::tagSocket(int sockFd, uint32_t tag, uid_t chargeUid, uid_t realUid) { std::lock_guard guard(mMutex); - if (chargeUid != realUid && !hasUpdateDeviceStatsPermission(realUid)) { - return -EPERM; - } + if (!mCookieTagMap.isValid()) return -EPERM; + + if (chargeUid != realUid && !hasUpdateDeviceStatsPermission(realUid)) return -EPERM; // Note that tagging the socket to AID_CLAT is only implemented in JNI ClatCoordinator. // The process is not allowed to tag socket to AID_CLAT via tagSocket() which would cause // process data usage accounting to be bypassed. Tagging AID_CLAT is used for avoiding counting // CLAT traffic data usage twice. See packages/modules/Connectivity/service/jni/ // com_android_server_connectivity_ClatCoordinator.cpp - if (chargeUid == AID_CLAT) { - return -EPERM; - } + if (chargeUid == AID_CLAT) return -EPERM; // The socket destroy listener only monitors on the group {INET_TCP, INET_UDP, INET6_TCP, // INET6_UDP}. Tagging listener unsupported socket causes that the tag can't be removed from @@ -180,6 +178,7 @@ int BpfHandler::tagSocket(int sockFd, uint32_t tag, uid_t chargeUid, uid_t realU uint64_t sock_cookie = getSocketCookie(sockFd); if (sock_cookie == NONEXISTENT_COOKIE) return -errno; + UidTagValue newKey = {.uid = (uint32_t)chargeUid, .tag = tag}; uint32_t totalEntryCount = 0; @@ -242,9 +241,11 @@ int BpfHandler::tagSocket(int sockFd, uint32_t tag, uid_t chargeUid, uid_t realU int BpfHandler::untagSocket(int sockFd) { std::lock_guard guard(mMutex); - uint64_t sock_cookie = getSocketCookie(sockFd); + uint64_t sock_cookie = getSocketCookie(sockFd); if (sock_cookie == NONEXISTENT_COOKIE) return -errno; + + if (!mCookieTagMap.isValid()) return -EPERM; base::Result res = mCookieTagMap.deleteValue(sock_cookie); if (!res.ok()) { ALOGE("Failed to untag socket: %s", strerror(res.error().code())); diff --git a/netd/NetdUpdatable.cpp b/netd/NetdUpdatable.cpp index f0997fc151..41b1fdbb12 100644 --- a/netd/NetdUpdatable.cpp +++ b/netd/NetdUpdatable.cpp @@ -16,19 +16,20 @@ #define LOG_TAG "NetdUpdatable" -#include "NetdUpdatable.h" +#include "BpfHandler.h" #include #include #include "NetdUpdatablePublic.h" +static android::net::BpfHandler sBpfHandler; + int libnetd_updatable_init(const char* cg2_path) { android::base::InitLogging(/*argv=*/nullptr); LOG(INFO) << __func__ << ": Initializing"; - android::net::gNetdUpdatable = android::net::NetdUpdatable::getInstance(); - android::netdutils::Status ret = android::net::gNetdUpdatable->mBpfHandler.init(cg2_path); + android::netdutils::Status ret = sBpfHandler.init(cg2_path); if (!android::netdutils::isOk(ret)) { LOG(ERROR) << __func__ << ": BPF handler init failed"; return -ret.code(); @@ -37,25 +38,9 @@ int libnetd_updatable_init(const char* cg2_path) { } int libnetd_updatable_tagSocket(int sockFd, uint32_t tag, uid_t chargeUid, uid_t realUid) { - if (android::net::gNetdUpdatable == nullptr) return -EPERM; - return android::net::gNetdUpdatable->mBpfHandler.tagSocket(sockFd, tag, chargeUid, realUid); + return sBpfHandler.tagSocket(sockFd, tag, chargeUid, realUid); } int libnetd_updatable_untagSocket(int sockFd) { - if (android::net::gNetdUpdatable == nullptr) return -EPERM; - return android::net::gNetdUpdatable->mBpfHandler.untagSocket(sockFd); + return sBpfHandler.untagSocket(sockFd); } - -namespace android { -namespace net { - -NetdUpdatable* gNetdUpdatable = nullptr; - -NetdUpdatable* NetdUpdatable::getInstance() { - // Instantiated on first use. - static NetdUpdatable instance; - return &instance; -} - -} // namespace net -} // namespace android diff --git a/netd/NetdUpdatable.h b/netd/NetdUpdatable.h deleted file mode 100644 index 333037fb49..0000000000 --- a/netd/NetdUpdatable.h +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright (c) 2022, The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include "BpfHandler.h" - -namespace android { -namespace net { - -class NetdUpdatable { - public: - NetdUpdatable() = default; - NetdUpdatable(const NetdUpdatable&) = delete; - NetdUpdatable& operator=(const NetdUpdatable&) = delete; - static NetdUpdatable* getInstance(); - - BpfHandler mBpfHandler; -}; - -extern NetdUpdatable* gNetdUpdatable; - -} // namespace net -} // namespace android \ No newline at end of file