Merge git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf
Daniel Borkmann says: ==================== pull-request: bpf 2020-04-10 The following pull-request contains BPF updates for your *net* tree. We've added 13 non-merge commits during the last 7 day(s) which contain a total of 13 files changed, 137 insertions(+), 43 deletions(-). The main changes are: 1) JIT code emission fixes for riscv and arm32, from Luke Nelson and Xi Wang. 2) Disable vmlinux BTF info if GCC_PLUGIN_RANDSTRUCT is used, from Slava Bacherikov. 3) Fix oob write in AF_XDP when meta data is used, from Li RongQing. 4) Fix bpf_get_link_xdp_id() handling on single prog when flags are specified, from Andrey Ignatov. 5) Fix sk_assign() BPF helper for request sockets that can have sk_reuseport field uninitialized, from Joe Stringer. 6) Fix mprotect() test case for the BPF LSM, from KP Singh. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -15,7 +15,10 @@
|
||||
|
||||
char *CMD_ARGS[] = {"true", NULL};
|
||||
|
||||
int heap_mprotect(void)
|
||||
#define GET_PAGE_ADDR(ADDR, PAGE_SIZE) \
|
||||
(char *)(((unsigned long) (ADDR + PAGE_SIZE)) & ~(PAGE_SIZE-1))
|
||||
|
||||
int stack_mprotect(void)
|
||||
{
|
||||
void *buf;
|
||||
long sz;
|
||||
@@ -25,12 +28,9 @@ int heap_mprotect(void)
|
||||
if (sz < 0)
|
||||
return sz;
|
||||
|
||||
buf = memalign(sz, 2 * sz);
|
||||
if (buf == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = mprotect(buf, sz, PROT_READ | PROT_WRITE | PROT_EXEC);
|
||||
free(buf);
|
||||
buf = alloca(sz * 3);
|
||||
ret = mprotect(GET_PAGE_ADDR(buf, sz), sz,
|
||||
PROT_READ | PROT_WRITE | PROT_EXEC);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -73,8 +73,8 @@ void test_test_lsm(void)
|
||||
|
||||
skel->bss->monitored_pid = getpid();
|
||||
|
||||
err = heap_mprotect();
|
||||
if (CHECK(errno != EPERM, "heap_mprotect", "want errno=EPERM, got %d\n",
|
||||
err = stack_mprotect();
|
||||
if (CHECK(errno != EPERM, "stack_mprotect", "want err=EPERM, got %d\n",
|
||||
errno))
|
||||
goto close_prog;
|
||||
|
||||
|
68
tools/testing/selftests/bpf/prog_tests/xdp_info.c
Normal file
68
tools/testing/selftests/bpf/prog_tests/xdp_info.c
Normal file
@@ -0,0 +1,68 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
#include <linux/if_link.h>
|
||||
#include <test_progs.h>
|
||||
|
||||
#define IFINDEX_LO 1
|
||||
|
||||
void test_xdp_info(void)
|
||||
{
|
||||
__u32 len = sizeof(struct bpf_prog_info), duration = 0, prog_id;
|
||||
const char *file = "./xdp_dummy.o";
|
||||
struct bpf_prog_info info = {};
|
||||
struct bpf_object *obj;
|
||||
int err, prog_fd;
|
||||
|
||||
/* Get prog_id for XDP_ATTACHED_NONE mode */
|
||||
|
||||
err = bpf_get_link_xdp_id(IFINDEX_LO, &prog_id, 0);
|
||||
if (CHECK(err, "get_xdp_none", "errno=%d\n", errno))
|
||||
return;
|
||||
if (CHECK(prog_id, "prog_id_none", "unexpected prog_id=%u\n", prog_id))
|
||||
return;
|
||||
|
||||
err = bpf_get_link_xdp_id(IFINDEX_LO, &prog_id, XDP_FLAGS_SKB_MODE);
|
||||
if (CHECK(err, "get_xdp_none_skb", "errno=%d\n", errno))
|
||||
return;
|
||||
if (CHECK(prog_id, "prog_id_none_skb", "unexpected prog_id=%u\n",
|
||||
prog_id))
|
||||
return;
|
||||
|
||||
/* Setup prog */
|
||||
|
||||
err = bpf_prog_load(file, BPF_PROG_TYPE_XDP, &obj, &prog_fd);
|
||||
if (CHECK_FAIL(err))
|
||||
return;
|
||||
|
||||
err = bpf_obj_get_info_by_fd(prog_fd, &info, &len);
|
||||
if (CHECK(err, "get_prog_info", "errno=%d\n", errno))
|
||||
goto out_close;
|
||||
|
||||
err = bpf_set_link_xdp_fd(IFINDEX_LO, prog_fd, XDP_FLAGS_SKB_MODE);
|
||||
if (CHECK(err, "set_xdp_skb", "errno=%d\n", errno))
|
||||
goto out_close;
|
||||
|
||||
/* Get prog_id for single prog mode */
|
||||
|
||||
err = bpf_get_link_xdp_id(IFINDEX_LO, &prog_id, 0);
|
||||
if (CHECK(err, "get_xdp", "errno=%d\n", errno))
|
||||
goto out;
|
||||
if (CHECK(prog_id != info.id, "prog_id", "prog_id not available\n"))
|
||||
goto out;
|
||||
|
||||
err = bpf_get_link_xdp_id(IFINDEX_LO, &prog_id, XDP_FLAGS_SKB_MODE);
|
||||
if (CHECK(err, "get_xdp_skb", "errno=%d\n", errno))
|
||||
goto out;
|
||||
if (CHECK(prog_id != info.id, "prog_id_skb", "prog_id not available\n"))
|
||||
goto out;
|
||||
|
||||
err = bpf_get_link_xdp_id(IFINDEX_LO, &prog_id, XDP_FLAGS_DRV_MODE);
|
||||
if (CHECK(err, "get_xdp_drv", "errno=%d\n", errno))
|
||||
goto out;
|
||||
if (CHECK(prog_id, "prog_id_drv", "unexpected prog_id=%u\n", prog_id))
|
||||
goto out;
|
||||
|
||||
out:
|
||||
bpf_set_link_xdp_fd(IFINDEX_LO, -1, 0);
|
||||
out_close:
|
||||
bpf_object__close(obj);
|
||||
}
|
@@ -23,12 +23,12 @@ int BPF_PROG(test_int_hook, struct vm_area_struct *vma,
|
||||
return ret;
|
||||
|
||||
__u32 pid = bpf_get_current_pid_tgid() >> 32;
|
||||
int is_heap = 0;
|
||||
int is_stack = 0;
|
||||
|
||||
is_heap = (vma->vm_start >= vma->vm_mm->start_brk &&
|
||||
vma->vm_end <= vma->vm_mm->brk);
|
||||
is_stack = (vma->vm_start <= vma->vm_mm->start_stack &&
|
||||
vma->vm_end >= vma->vm_mm->start_stack);
|
||||
|
||||
if (is_heap && monitored_pid == pid) {
|
||||
if (is_stack && monitored_pid == pid) {
|
||||
mprotect_count++;
|
||||
ret = -EPERM;
|
||||
}
|
||||
|
@@ -501,7 +501,7 @@
|
||||
.result = REJECT
|
||||
},
|
||||
{
|
||||
"bounds check mixed 32bit and 64bit arithmatic. test1",
|
||||
"bounds check mixed 32bit and 64bit arithmetic. test1",
|
||||
.insns = {
|
||||
BPF_MOV64_IMM(BPF_REG_0, 0),
|
||||
BPF_MOV64_IMM(BPF_REG_1, -1),
|
||||
@@ -520,7 +520,7 @@
|
||||
.result = ACCEPT
|
||||
},
|
||||
{
|
||||
"bounds check mixed 32bit and 64bit arithmatic. test2",
|
||||
"bounds check mixed 32bit and 64bit arithmetic. test2",
|
||||
.insns = {
|
||||
BPF_MOV64_IMM(BPF_REG_0, 0),
|
||||
BPF_MOV64_IMM(BPF_REG_1, -1),
|
||||
|
Reference in New Issue
Block a user