aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHyunwoo Kim <v4bel@theori.io>2024-04-22 05:39:30 -0400
committerDavid S. Miller <davem@davemloft.net>2024-04-24 11:46:31 +0100
commitf2a904107ee2b647bb7794a1a82b67740d7c8a64 (patch)
tree1ce6bfa0f7b1b969617d26531f72e8476ae1640a
parent80e679b352c3ce5158f3f778cfb77eb767e586fb (diff)
net: gtp: Fix Use-After-Free in gtp_dellink
Since call_rcu, which is called in the hlist_for_each_entry_rcu traversal of gtp_dellink, is not part of the RCU read critical section, it is possible that the RCU grace period will pass during the traversal and the key will be free. To prevent this, it should be changed to hlist_for_each_entry_safe. Fixes: 94dc550a5062 ("gtp: fix an use-after-free in ipv4_pdp_find()") Signed-off-by: Hyunwoo Kim <v4bel@theori.io> Reviewed-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/gtp.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/net/gtp.c b/drivers/net/gtp.c
index ba4704c2c640b..e62d6cbdf9bc6 100644
--- a/drivers/net/gtp.c
+++ b/drivers/net/gtp.c
@@ -1098,11 +1098,12 @@ out_hashtable:
static void gtp_dellink(struct net_device *dev, struct list_head *head)
{
struct gtp_dev *gtp = netdev_priv(dev);
+ struct hlist_node *next;
struct pdp_ctx *pctx;
int i;
for (i = 0; i < gtp->hash_size; i++)
- hlist_for_each_entry_rcu(pctx, &gtp->tid_hash[i], hlist_tid)
+ hlist_for_each_entry_safe(pctx, next, &gtp->tid_hash[i], hlist_tid)
pdp_context_delete(pctx);
list_del_rcu(&gtp->list);