No description
eb199dd748
bpf_obj_get(path) is entirely equivalent to mapRetrieveRW(path) See implementation in frameworks/libs/net common/native/bpf_syscall_wrappers/include/BpfSyscallWrappers.h: inline int bpfFdGet(const char* pathname, uint32_t flag) { return bpf(BPF_OBJ_GET, { .pathname = ptr_to_u64(pathname), .file_flags = flag, }); } inline int mapRetrieve(const char* pathname, uint32_t flag) { return bpfFdGet(pathname, flag); } inline int mapRetrieveRW(const char* pathname) { return mapRetrieve(pathname, 0); } inline int mapRetrieveRO(const char* pathname) { return mapRetrieve(pathname, BPF_F_RDONLY); } inline int mapRetrieveWO(const char* pathname) { return mapRetrieve(pathname, BPF_F_WRONLY); } inline int retrieveProgram(const char* pathname) { return bpfFdGet(pathname, BPF_F_RDONLY); } However, this requires selinux file:write access which bpfloader currently lacks, ie. we would need: system/sepolicy private/bpfloader.te: -allow bpfloader bpffs_type:file { create read rename setattr }; +allow bpfloader bpffs_type:file { create read rename setattr write }; Switching from mapRetrieveRW() to mapRetrieveRO() eliminates this problem. BpfLoader itself does not need to write to the maps, while bpf program write access is controlled by a different bit (it is independent of the r/w access bits of the file descriptor itself). Verified by re-opening the maps after pinning them. Bug: 218408035 Bug: 237716689 Test: TreeHugger Signed-off-by: Maciej Żenczykowski <maze@google.com> Change-Id: Ica7ac8ee48d4a73e5f92dbf47cd441c3bfba38cf |
||
---|---|---|
bpfloader | ||
libbpf_android | ||
progs | ||
.clang-format | ||
Android.bp | ||
NOTICE | ||
OWNERS | ||
OWNERS_bpf | ||
PREUPLOAD.cfg |