From: Mark Wielaard Date: Tue, 12 Oct 2021 21:15:41 +0000 (+0200) Subject: Implement BPF_MAP_LOOKUP_AND_DELETE_ELEM and BPF_MAP_FREEZE X-Git-Tag: VALGRIND_3_18_0~7 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ef95220ddae1af65c85d8d59a8f0dcbb9d7af90f;p=thirdparty%2Fvalgrind.git Implement BPF_MAP_LOOKUP_AND_DELETE_ELEM and BPF_MAP_FREEZE Implement BPF_MAP_LOOKUP_AND_DELETE_ELEM (command 21) and BPF_MAP_FREEZE (command 22) and produce a WARNING instead of a fatal error for unrecognized BPF commands. https://bugs.kde.org/show_bug.cgi?id=426148 --- diff --git a/NEWS b/NEWS index 1127583013..73add35e5c 100644 --- a/NEWS +++ b/NEWS @@ -44,6 +44,7 @@ are not entered into bugzilla tend to get forgotten about or ignored. 368960 WARNING: unhandled amd64-linux syscall: 163 (acct) 407589 [Linux] Add support for C11 aligned_alloc() and GNU reallocarray() 423963 Error in child thread when CLONE_PIDFD is used +426148 crash with "impossible happened" when running BPF CO-RE programs 429375 PPC ISA 3.1 support is missing, part 9 431157 PPC_FEATURE2_SCV needs to be masked in AT_HWCAP2 431306 Update demangler to support Rust v0 name mangling diff --git a/coregrind/m_syswrap/syswrap-linux.c b/coregrind/m_syswrap/syswrap-linux.c index 63dd1fb66e..50203eca09 100644 --- a/coregrind/m_syswrap/syswrap-linux.c +++ b/coregrind/m_syswrap/syswrap-linux.c @@ -12954,10 +12954,30 @@ PRE(sys_bpf) } } break; + case VKI_BPF_MAP_LOOKUP_AND_DELETE_ELEM: + /* Perform a lookup on an eBPF map. Read key, write value (delete key) */ + PRE_MEM_READ("bpf(attr->key)", (Addr)&attr->key, sizeof(attr->key)); + PRE_MEM_READ("bpf(attr->value)", (Addr)&attr->value, sizeof(attr->value)); + PRE_MEM_READ("bpf(attr->map_fd)", (Addr)&attr->map_fd, sizeof(attr->map_fd)); + if (ML_(safe_to_deref)(attr, ARG3)) { + if (!ML_(fd_allowed)(attr->map_fd, "bpf", tid, False)) { + SET_STATUS_Failure(VKI_EBADF); + break; + } + /* Get size of key and value for this map. */ + if (bpf_map_get_sizes(attr->map_fd, &key_size, &value_size)) { + PRE_MEM_READ("bpf(attr->key)", attr->key, key_size); + PRE_MEM_WRITE("bpf(attr->value)", attr->value, value_size); + } + } + break; + case VKI_BPF_MAP_FREEZE: + /* Freeze map, read map_fd (write frozen flag, not visible to user space). */ + PRE_MEM_READ("bpf(attr->map_fd)", (Addr)&attr->map_fd, sizeof(attr->map_fd)); + break; default: VG_(message)(Vg_DebugMsg, - "FATAL: unhandled eBPF command %lu\n", ARG1); - VG_(core_panic)("... bye!\n"); + "WARNING: unhandled eBPF command %lu\n", ARG1); break; } } @@ -13054,10 +13074,16 @@ POST(sys_bpf) POST_MEM_WRITE((Addr)&attr->task_fd_query.probe_offset, sizeof(attr->task_fd_query.probe_offset)); POST_MEM_WRITE((Addr)&attr->task_fd_query.probe_addr, sizeof(attr->task_fd_query.probe_addr)); break; + case VKI_BPF_MAP_LOOKUP_AND_DELETE_ELEM: + if (bpf_map_get_sizes(attr->map_fd, &key_size, &value_size)) + POST_MEM_WRITE(attr->value, value_size); + break; + case VKI_BPF_MAP_FREEZE: + /* Freeze map, read map_fd (write frozen flag, not visible to user space). */ + break; default: VG_(message)(Vg_DebugMsg, - "FATAL: unhandled eBPF command %lu\n", ARG1); - VG_(core_panic)("... bye!\n"); + "WARNING: unhandled eBPF command %lu\n", ARG1); break; } } diff --git a/include/vki/vki-linux.h b/include/vki/vki-linux.h index eb4e01b337..e6cef7dfff 100644 --- a/include/vki/vki-linux.h +++ b/include/vki/vki-linux.h @@ -4966,6 +4966,8 @@ enum vki_bpf_cmd { VKI_BPF_BTF_LOAD, VKI_BPF_BTF_GET_FD_BY_ID, VKI_BPF_TASK_FD_QUERY, + VKI_BPF_MAP_LOOKUP_AND_DELETE_ELEM, + VKI_BPF_MAP_FREEZE, }; enum vki_bpf_map_type {