]> git.baikalelectronics.ru Git - kernel.git/commit
bpf: whitelist all syscalls for error injection
authorHoward McLauchlan <hmclauchlan@fb.com>
Thu, 22 Mar 2018 01:59:08 +0000 (18:59 -0700)
committerDominik Brodowski <linux@dominikbrodowski.net>
Mon, 2 Apr 2018 18:16:21 +0000 (20:16 +0200)
commit4aa76ac738b581b108fcf8ed0695e83781bc2f31
tree278cec14b206aa6dcaad30b9da6f19b7b4df1fc6
parent52daf4a65802a4d48b2f26810ee8cd03f2b26d50
bpf: whitelist all syscalls for error injection

Error injection is a useful mechanism to fail arbitrary kernel
functions. However, it is often hard to guarantee an error propagates
appropriately to user space programs. By injecting into syscalls, we can
return arbitrary values to user space directly; this increases
flexibility and robustness in testing, allowing us to test user space
error paths effectively.

The following script, for example, fails calls to sys_open() from a
given pid:

from bcc import BPF
from sys import argv

pid = argv[1]

prog = r"""

int kprobe__SyS_open(struct pt_regs *ctx, const char *pathname, int flags)
{
    u32 pid = bpf_get_current_pid_tgid();
    if (pid == %s)
        bpf_override_return(ctx, -ENOMEM);
    return 0;
}
""" % pid

b = BPF(text=prog)
while 1:
    b.perf_buffer_poll()

This patch whitelists all syscalls defined with SYSCALL_DEFINE and
COMPAT_SYSCALL_DEFINE for error injection. These changes are not
intended to be considered stable, and would normally be configured off.

Signed-off-by: Howard McLauchlan <hmclauchlan@fb.com>
Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
include/linux/compat.h
include/linux/syscalls.h