]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Implement BPF_MAP_LOOKUP_AND_DELETE_ELEM and BPF_MAP_FREEZE
authorMark Wielaard <mark@klomp.org>
Tue, 12 Oct 2021 21:15:41 +0000 (23:15 +0200)
committerMark Wielaard <mark@klomp.org>
Tue, 12 Oct 2021 21:15:41 +0000 (23:15 +0200)
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

NEWS
coregrind/m_syswrap/syswrap-linux.c
include/vki/vki-linux.h

diff --git a/NEWS b/NEWS
index 112758301306f6c1e331315f08824252632f2688..73add35e5c555e2d975e53c4bf834ae47a8616d3 100644 (file)
--- 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
index 63dd1fb66e81b5bc11073f8f7cd42146463e389b..50203eca096b5e576eed7f738c968b42cc815117 100644 (file)
@@ -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;
    }
 }
index eb4e01b3374c8c5e9338131ae80facde59ae3e06..e6cef7dffff4a78e7bcc8c4161834587b5406c13 100644 (file)
@@ -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 {