On Mon, 1 Apr 2024 13:00:12 +0200, Jesper Dangaard Brouer wrote:
This can work, but I think is_valid_dst() is better, as its internal inspection[Fix]This is overkill, because __xdp_enqueue() already contains most of the
On the execution path of bpf_prog_test_run(), due to ri->map being NULL,
ri->tgtvalue was not set correctly.
Reported-and-tested-by:syzbot+af9492708df9797198d6@xxxxxxxxxxxxxxxxxxxxxxxxx
Signed-off-by: Edward Adam Davis<eadavis@xxxxxx>
---
kernel/bpf/devmap.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/kernel/bpf/devmap.c b/kernel/bpf/devmap.c
index 4e2cdbb5629f..ef20de14154a 100644
--- a/kernel/bpf/devmap.c
+++ b/kernel/bpf/devmap.c
@@ -86,6 +86,7 @@ struct bpf_dtab {
static DEFINE_PER_CPU(struct list_head, dev_flush_list);
static DEFINE_SPINLOCK(dev_map_lock);
static LIST_HEAD(dev_map_list);
+static bool is_valid_dst(struct bpf_dtab_netdev *obj, struct xdp_frame *xdpf);
static struct hlist_head *dev_map_create_hash(unsigned int entries,
int numa_node)
@@ -536,7 +537,10 @@ int dev_xdp_enqueue(struct net_device *dev, struct xdp_frame *xdpf,
int dev_map_enqueue(struct bpf_dtab_netdev *dst, struct xdp_frame *xdpf,
struct net_device *dev_rx)
{
- struct net_device *dev = dst->dev;
+ struct net_device *dev;
+ if (!is_valid_dst(dst, xdpf))
checks in is_valid_dst().
Why not:
if (!dst)
return -EINVAL;
of dst is more thorough.