Skip to content
  • Howard McLauchlan's avatar
    bpf: whitelist all syscalls for error injection · c9a21195
    Howard McLauchlan authored
    
    
    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: default avatarHoward McLauchlan <hmclauchlan@fb.com>
    Signed-off-by: default avatarDominik Brodowski <linux@dominikbrodowski.net>
    c9a21195