diff options
| author | Paul Chaignon <paul.chaignon@gmail.com> | 2023-08-24 13:29:26 +0200 |
|---|---|---|
| committer | Aleksandr Nogikh <nogikh@google.com> | 2023-08-25 14:18:37 +0000 |
| commit | 96e2da37710a4f74ccb24cf782cc98dd7c015e1c (patch) | |
| tree | a4f60826c6a6596f8270e17aa6f2e1f09978d1d0 /sys | |
| parent | 7481b108ac4af790dfc163514c6dc3a1ff5f3902 (diff) | |
sys/linux: support O_PATH fds in BPF_OBJ_* cmds
Commit [1] upstream added support for O_PATH fds in BPF_OBJ_* commands.
This commit implements the same support in syzkaller.
The flag BPF_F_PATH_FD must be set when passing an O_PATH to the
BPF_OBJ_* commands. We therefore declare generic and O_PATH-specific
variants of the existing BPF_OBJ structs.
1 - https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=cb8edce2807
Signed-off-by: Paul Chaignon <paul.chaignon@gmail.com>
Diffstat (limited to 'sys')
| -rw-r--r-- | sys/linux/bpf.txt | 47 | ||||
| -rw-r--r-- | sys/linux/bpf.txt.const | 1 |
2 files changed, 45 insertions, 3 deletions
diff --git a/sys/linux/bpf.txt b/sys/linux/bpf.txt index ea35eecf7..e15b1505e 100644 --- a/sys/linux/bpf.txt +++ b/sys/linux/bpf.txt @@ -503,23 +503,63 @@ bpf_reg = BPF_REG_0, BPF_REG_1, BPF_REG_2, BPF_REG_3, BPF_REG_4, BPF_REG_5, BPF_ define MAX_BPF_REG __MAX_BPF_REG +bpf_obj_pin_map [ + generic bpf_obj_pin_map_generic + o_path bpf_obj_pin_map_o_path +] + +bpf_obj_pin_prog [ + generic bpf_obj_pin_prog_generic + o_path bpf_obj_pin_prog_o_path +] + +bpf_obj_get [ + generic bpf_obj_get_generic + o_path bpf_obj_get_o_path +] + # NEED: these filenames must be on bpf filesystem, can we do it somehow? -bpf_obj_pin_map { +bpf_obj_pin_map_generic { path ptr64[in, filename] fd fd_bpf_map flags const[0, int32] + path_fd const[0, int32] } -bpf_obj_pin_prog { +bpf_obj_pin_prog_generic { path ptr64[in, filename] fd fd_bpf_prog flags const[0, int32] + path_fd const[0, int32] } -bpf_obj_get { +bpf_obj_get_generic { path ptr64[in, filename] fd const[0, int32] file_flags flags[bpf_open_flags, int32] + path_fd const[0, int32] +} + +# NEED: Specific type for O_PATH fds (for path_fd). +bpf_obj_pin_map_o_path { + path ptr64[in, filename] + fd fd_bpf_map + flags const[BPF_F_PATH_FD, int32] + path_fd fd +} + +bpf_obj_pin_prog_o_path { + path ptr64[in, filename] + fd fd_bpf_prog + flags const[BPF_F_PATH_FD, int32] + path_fd fd +} + +bpf_obj_get_o_path { + path ptr64[in, filename] + fd const[0, int32] + file_flags flags[bpf_obj_get_flags, int32] + path_fd fd } bpf_attach_targets [ @@ -905,3 +945,4 @@ bpf_prog_query_attach_type = BPF_CGROUP_INET_INGRESS, BPF_CGROUP_INET_EGRESS, BP bpf_open_flags = BPF_F_RDONLY, BPF_F_WRONLY bpf_stat_types = BPF_STATS_RUN_TIME bpf_core_relo_kind = BPF_CORE_FIELD_BYTE_OFFSET, BPF_CORE_FIELD_BYTE_SIZE, BPF_CORE_FIELD_EXISTS, BPF_CORE_FIELD_SIGNED, BPF_CORE_FIELD_LSHIFT_U64, BPF_CORE_FIELD_RSHIFT_U64, BPF_CORE_TYPE_ID_LOCAL, BPF_CORE_TYPE_ID_TARGET, BPF_CORE_TYPE_EXISTS, BPF_CORE_TYPE_SIZE, BPF_CORE_ENUMVAL_EXISTS, BPF_CORE_ENUMVAL_VALUE, BPF_CORE_TYPE_MATCHES +bpf_obj_get_flags = BPF_F_PATH_FD, bpf_open_flags diff --git a/sys/linux/bpf.txt.const b/sys/linux/bpf.txt.const index 176faccfa..9a2b54374 100644 --- a/sys/linux/bpf.txt.const +++ b/sys/linux/bpf.txt.const @@ -68,6 +68,7 @@ BPF_F_MMAPABLE = 1024 BPF_F_NO_COMMON_LRU = 2 BPF_F_NO_PREALLOC = 1 BPF_F_NUMA_NODE = 4 +BPF_F_PATH_FD = 16384 BPF_F_PRESERVE_ELEMS = 2048 BPF_F_QUERY_EFFECTIVE = 1 BPF_F_RDONLY = 8 |
