Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net/sched: don't dereference a->goto_chain to read the chain index

callers of tcf_gact_goto_chain_index() can potentially read an old value
of the chain index, or even dereference a NULL 'goto_chain' pointer,
because 'goto_chain' and 'tcfa_action' are read in the traffic path
without caring of concurrent write in the control path. The most recent
value of chain index can be read also from a->tcfa_action (it's encoded
there together with TC_ACT_GOTO_CHAIN bits), so we don't really need to
dereference 'goto_chain': just read the chain id from the control action.

Fixes: e457d86ada27 ("net: sched: add couple of goto_chain helpers")
Signed-off-by: Davide Caratti <dcaratti@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Davide Caratti and committed by
David S. Miller
fe384e2f 7e0c8892

+1 -1
+1 -1
include/net/tc_act/tc_gact.h
··· 56 56 57 57 static inline u32 tcf_gact_goto_chain_index(const struct tc_action *a) 58 58 { 59 - return a->goto_chain->index; 59 + return READ_ONCE(a->tcfa_action) & TC_ACT_EXT_VAL_MASK; 60 60 } 61 61 62 62 #endif /* __NET_TC_GACT_H */