diff --git a/service/jni/com_android_server_connectivity_ClatCoordinator.cpp b/service/jni/com_android_server_connectivity_ClatCoordinator.cpp index 18a274a12d..c0082bbe3a 100644 --- a/service/jni/com_android_server_connectivity_ClatCoordinator.cpp +++ b/service/jni/com_android_server_connectivity_ClatCoordinator.cpp @@ -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); diff --git a/staticlibs/native/bpf_syscall_wrappers/include/BpfSyscallWrappers.h b/staticlibs/native/bpf_syscall_wrappers/include/BpfSyscallWrappers.h index 5bb3100a78..73cef8913d 100644 --- a/staticlibs/native/bpf_syscall_wrappers/include/BpfSyscallWrappers.h +++ b/staticlibs/native/bpf_syscall_wrappers/include/BpfSyscallWrappers.h @@ -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) {