提交 2623734d 编写于 作者: J Jason Wang 提交者: Xie XiuQi

tuntap: fix dividing by zero in ebpf queue selection

mainline inclusion
from mainline-5.1
commit a35d310f03a692bf4798eb309a1950a06a150620
category: bugfix
bugzilla: 13267
CVE: NA

-------------------------------------------------

We need check if tun->numqueues is zero (e.g for the persist device)
before trying to use it for modular arithmetic.
Reported-by: NEric Dumazet <eric.dumazet@gmail.com>
Fixes: 96f84061("tun: add eBPF based queue selection method")
Signed-off-by: NJason Wang <jasowang@redhat.com>
Reviewed-by: NEric Dumazet <edumazet@google.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
Signed-off-by: NYueHaibing <yuehaibing@huawei.com>
Reviewed-by: NMao Wenan <maowenan@huawei.com>
Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
上级 e4f04ac5
...@@ -599,13 +599,18 @@ static u16 tun_automq_select_queue(struct tun_struct *tun, struct sk_buff *skb) ...@@ -599,13 +599,18 @@ static u16 tun_automq_select_queue(struct tun_struct *tun, struct sk_buff *skb)
static u16 tun_ebpf_select_queue(struct tun_struct *tun, struct sk_buff *skb) static u16 tun_ebpf_select_queue(struct tun_struct *tun, struct sk_buff *skb)
{ {
struct tun_prog *prog; struct tun_prog *prog;
u32 numqueues;
u16 ret = 0; u16 ret = 0;
numqueues = READ_ONCE(tun->numqueues);
if (!numqueues)
return 0;
prog = rcu_dereference(tun->steering_prog); prog = rcu_dereference(tun->steering_prog);
if (prog) if (prog)
ret = bpf_prog_run_clear_cb(prog->prog, skb); ret = bpf_prog_run_clear_cb(prog->prog, skb);
return ret % tun->numqueues; return ret % numqueues;
} }
static u16 tun_select_queue(struct net_device *dev, struct sk_buff *skb, static u16 tun_select_queue(struct net_device *dev, struct sk_buff *skb,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册