| From a92388eaaa842d82076873ff69e92638d03b2751 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 24 Oct 2018 20:15:17 +0900 |
| Subject: bpf: devmap: fix wrong interface selection in notifier_call |
| |
| From: Taehee Yoo <ap420073@gmail.com> |
| |
| [ Upstream commit f592f804831f1cf9d1f9966f58c80f150e6829b5 ] |
| |
| The dev_map_notification() removes interface in devmap if |
| unregistering interface's ifindex is same. |
| But only checking ifindex is not enough because other netns can have |
| same ifindex. so that wrong interface selection could occurred. |
| Hence netdev pointer comparison code is added. |
| |
| v2: compare netdev pointer instead of using net_eq() (Daniel Borkmann) |
| v1: Initial patch |
| |
| Fixes: 2ddf71e23cc2 ("net: add notifier hooks for devmap bpf map") |
| Signed-off-by: Taehee Yoo <ap420073@gmail.com> |
| Acked-by: Song Liu <songliubraving@fb.com> |
| Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| kernel/bpf/devmap.c | 3 +-- |
| 1 file changed, 1 insertion(+), 2 deletions(-) |
| |
| diff --git a/kernel/bpf/devmap.c b/kernel/bpf/devmap.c |
| index fc500ca464d00..1defea4b27553 100644 |
| --- a/kernel/bpf/devmap.c |
| +++ b/kernel/bpf/devmap.c |
| @@ -520,8 +520,7 @@ static int dev_map_notification(struct notifier_block *notifier, |
| struct bpf_dtab_netdev *dev, *odev; |
| |
| dev = READ_ONCE(dtab->netdev_map[i]); |
| - if (!dev || |
| - dev->dev->ifindex != netdev->ifindex) |
| + if (!dev || netdev != dev->dev) |
| continue; |
| odev = cmpxchg(&dtab->netdev_map[i], dev, NULL); |
| if (dev == odev) |
| -- |
| 2.20.1 |
| |