summaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorDavide Caratti <dcaratti@redhat.com>2019-03-20 15:00:15 +0100
committerDavid S. Miller <davem@davemloft.net>2019-03-21 21:26:42 +0100
commitfe384e2fa36ca084a456fd30558cccc75b4b3fbd (patch)
treee90582ded10560c8daf4e857a06966f212027c76 /include
parentnet/sched: act_vlan: validate the control action inside init() (diff)
downloadlinux-fe384e2fa36ca084a456fd30558cccc75b4b3fbd.tar.xz
linux-fe384e2fa36ca084a456fd30558cccc75b4b3fbd.zip
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>
Diffstat (limited to 'include')
-rw-r--r--include/net/tc_act/tc_gact.h2
1 files changed, 1 insertions, 1 deletions
diff --git a/include/net/tc_act/tc_gact.h b/include/net/tc_act/tc_gact.h
index ee8d005f56fc..eb8f01c819e6 100644
--- a/include/net/tc_act/tc_gact.h
+++ b/include/net/tc_act/tc_gact.h
@@ -56,7 +56,7 @@ static inline bool is_tcf_gact_goto_chain(const struct tc_action *a)
static inline u32 tcf_gact_goto_chain_index(const struct tc_action *a)
{
- return a->goto_chain->index;
+ return READ_ONCE(a->tcfa_action) & TC_ACT_EXT_VAL_MASK;
}
#endif /* __NET_TC_GACT_H */