introduce mapRetrieveLocklessRW()

the clat verifyPerms() checker only wants to check the
existence and accessibility of the maps.

Test: TreeHugger
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: I3079ab316bcd88370d774fec5e88c1b5ff438266
This commit is contained in:
Maciej Żenczykowski 2024-06-15 02:43:12 -07:00
commit 0fff839ae6
2 changed files with 9 additions and 3 deletions

View file

@ -80,7 +80,8 @@ static void verifyPerms(const char * const path,
case VERIFY_BIN: return;
case VERIFY_PROG: fd = bpf::retrieveProgram(path); break;
case VERIFY_MAP_RO: fd = bpf::mapRetrieveRO(path); break;
case VERIFY_MAP_RW: fd = bpf::mapRetrieveRW(path); break;
// lockless: we're just checking access rights and will immediately close the fd
case VERIFY_MAP_RW: fd = bpf::mapRetrieveLocklessRW(path); break;
}
if (fd < 0) ALOGF("bpf_obj_get '%s' failed, errno=%d", path, errno);

View file

@ -166,11 +166,16 @@ inline int bpfLock(int fd, short type) {
return ret; // most likely -1 with errno == EAGAIN, due to already held lock
}
inline int mapRetrieveExclusiveRW(const char* pathname) {
return bpfLock(bpfFdGet(pathname, 0), F_WRLCK);
inline int mapRetrieveLocklessRW(const char* pathname) {
return bpfFdGet(pathname, 0);
}
inline int mapRetrieveExclusiveRW(const char* pathname) {
return bpfLock(mapRetrieveLocklessRW(pathname), F_WRLCK);
}
inline int mapRetrieveRW(const char* pathname) {
return bpfLock(bpfFdGet(pathname, 0), F_RDLCK);
return bpfLock(mapRetrieveLocklessRW(pathname), F_RDLCK);
}
inline int mapRetrieveRO(const char* pathname) {