On Mon, 2017-10-02 at 16:48 -0700, Alexei Starovoitov wrote:
> introduce BPF_PROG_QUERY command to retrieve a set of either
> attached programs to given cgroup or a set of effective programs
> that will execute for events within a cgroup
>
...
> +
> +int bpf_prog_array_copy_to_user(struct bpf_prog_array __rcu *progs,
> + __u32 __user *prog_ids)
> +{
> + struct bpf_prog **prog;
> + u32 cnt = 0, id;
> +
> + rcu_read_lock();
> + prog = rcu_dereference(progs)->progs;
> + for (; *prog; prog++) {
> + id = (*prog)->aux->id;
> + if (copy_to_user(prog_ids + cnt, &id, sizeof(id))) {
> + rcu_read_unlock();
> + return -EFAULT;
> + }
> + cnt++;
> + }
> + rcu_read_unlock();
> + return 0;
> +}
We can not use copy_to_user() inside rcu_read_lock() section.
CONFIG_DEBUG_ATOMIC_SLEEP=y would have detected this problem.
Courtesy of syzbot, obviously.