This commit addresses an issue where a netdevice was found to be uninitialized. To mitigate this case, the change ensures that BPF programs designed to test skb context initialization thoroughly verify the availability of a fully initialized context before execution.The root cause of a NULL ctx stems from the initialization process in bpf_ctx_init(). This function returns NULL if the user initializes the bpf_attr variables ctx_in and ctx_out with invalid pointers or sets them to NULL. These variables are directly controlled by user input, and if both are NULL, the context cannot be initialized, resulting in a NULL ctx. Reported-by: syzbot+cca39e6e84a367a7e6f6@xxxxxxxxxxxxxxxxxxxxxxxxx Closes: https://syzkaller.appspot.com/bug?extid=cca39e6e84a367a7e6f6 Link: https://lore.kernel.org/all/000000000000b95d41061cbf302a@xxxxxxxxxx/ Signed-off-by: Michal Switala <michal.switala@xxxxxxxxxxxx> --- net/bpf/test_run.c | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/net/bpf/test_run.c b/net/bpf/test_run.c index 36ae54f57bf5..8b2efcee059f 100644 --- a/net/bpf/test_run.c +++ b/net/bpf/test_run.c @@ -970,7 +970,7 @@ static struct proto bpf_dummy_proto = { int bpf_prog_test_run_skb(struct bpf_prog *prog, const union bpf_attr *kattr, union bpf_attr __user *uattr) { - bool is_l2 = false, is_direct_pkt_access = false; + bool is_l2 = false, is_direct_pkt_access = false, ctx_needed = false; struct net *net = current->nsproxy->net_ns; struct net_device *dev = net->loopback_dev; u32 size = kattr->test.data_size_in; @@ -998,6 +998,34 @@ int bpf_prog_test_run_skb(struct bpf_prog *prog, const union bpf_attr *kattr, return PTR_ERR(ctx); } + switch (prog->type) { + case BPF_PROG_TYPE_SOCKET_FILTER: + case BPF_PROG_TYPE_SCHED_CLS: + case BPF_PROG_TYPE_SCHED_ACT: + case BPF_PROG_TYPE_XDP: + case BPF_PROG_TYPE_CGROUP_SKB: + case BPF_PROG_TYPE_CGROUP_SOCK: + case BPF_PROG_TYPE_SOCK_OPS: + case BPF_PROG_TYPE_SK_SKB: + case BPF_PROG_TYPE_SK_MSG: + case BPF_PROG_TYPE_CGROUP_SOCK_ADDR: + case BPF_PROG_TYPE_LWT_SEG6LOCAL: + case BPF_PROG_TYPE_SK_REUSEPORT: + case BPF_PROG_TYPE_NETFILTER: + case BPF_PROG_TYPE_LWT_IN: + case BPF_PROG_TYPE_LWT_OUT: + case BPF_PROG_TYPE_LWT_XMIT: + ctx_needed = true; + break; + default: + break; + } + + if (!ctx && ctx_needed) { + kfree(data); + return -EINVAL; + } + switch (prog->type) { case BPF_PROG_TYPE_SCHED_CLS: case BPF_PROG_TYPE_SCHED_ACT: -- 2.43.0