Don't call into system_server for permissions check
With the recently added permission information in traffic controller,
netd can check if the calling process has permission UPDATE_DEVICE_STATS
without calling into system_server. Update the code path and add some
test cases for it.
Bug: 111560570
Bug: 111560739
Test: netd_unit_test, netd_integration_test
Change-Id: I79eee1321f32154e91466f023f7952db23df8494
diff --git a/server/FwmarkServer.cpp b/server/FwmarkServer.cpp
index dc05093..51d5398 100644
--- a/server/FwmarkServer.cpp
+++ b/server/FwmarkServer.cpp
@@ -37,7 +37,6 @@
namespace android {
namespace net {
-constexpr const char *UPDATE_DEVICE_STATS = "android.permission.UPDATE_DEVICE_STATS";
constexpr const char *SYSTEM_SERVER_CONTEXT = "u:r:system_server:s0";
bool isSystemServer(SocketClient* client) {
@@ -58,14 +57,6 @@
return ret;
}
-bool hasUpdateDeviceStatsPermission(SocketClient* client) {
- // If the caller is the system server, allow without any further checks.
- // Otherwise, if the system server's binder thread pool is full, and all the threads are
- // blocked on a thread that's waiting for us to complete, we deadlock. http://b/69389492
- return isSystemServer(client) ||
- checkPermission(String16(UPDATE_DEVICE_STATS), client->getPid(), client->getUid());
-}
-
FwmarkServer::FwmarkServer(NetworkController* networkController, EventReporter* eventReporter,
TrafficController* trafficCtrl)
: SocketListener(SOCKET_NAME, true),
@@ -133,17 +124,11 @@
}
if (command.cmdId == FwmarkCommand::SET_COUNTERSET) {
- if (!hasUpdateDeviceStatsPermission(client)) {
- return -EPERM;
- }
- return mTrafficCtrl->setCounterSet(command.trafficCtrlInfo, command.uid);
+ return mTrafficCtrl->setCounterSet(command.trafficCtrlInfo, command.uid, client->getUid());
}
if (command.cmdId == FwmarkCommand::DELETE_TAGDATA) {
- if (!hasUpdateDeviceStatsPermission(client)) {
- return -EPERM;
- }
- return mTrafficCtrl->deleteTagData(command.trafficCtrlInfo, command.uid);
+ return mTrafficCtrl->deleteTagData(command.trafficCtrlInfo, command.uid, client->getUid());
}
cmsghdr* const cmsgh = CMSG_FIRSTHDR(&message);
@@ -307,10 +292,8 @@
if (static_cast<int>(command.uid) == -1) {
command.uid = client->getUid();
}
- if (command.uid != client->getUid() && !hasUpdateDeviceStatsPermission(client)) {
- return -EPERM;
- }
- return mTrafficCtrl->tagSocket(*socketFd, command.trafficCtrlInfo, command.uid);
+ return mTrafficCtrl->tagSocket(*socketFd, command.trafficCtrlInfo, command.uid,
+ client->getUid());
}
case FwmarkCommand::UNTAG_SOCKET: {