Skip to content

Commit 7013908

Browse files
frextritedavem330
authored andcommitted
ipmr: Add lockdep expression to ipmr_for_each_table macro
During the initialization process, ipmr_new_table() is called to create new tables which in turn calls ipmr_get_table() which traverses net->ipv4.mr_tables without holding the writer lock. However, this is safe to do so as no tables exist at this time. Hence add a suitable lockdep expression to silence the following false-positive warning: ============================= WARNING: suspicious RCU usage 5.7.0-rc3-next-20200428-syzkaller #0 Not tainted ----------------------------- net/ipv4/ipmr.c:136 RCU-list traversed in non-reader section!! ipmr_get_table+0x130/0x160 net/ipv4/ipmr.c:136 ipmr_new_table net/ipv4/ipmr.c:403 [inline] ipmr_rules_init net/ipv4/ipmr.c:248 [inline] ipmr_net_init+0x133/0x430 net/ipv4/ipmr.c:3089 Fixes: f0ad086 ("ipv4: ipmr: support multiple tables") Reported-by: [email protected] Suggested-by: Jakub Kicinski <[email protected]> Signed-off-by: Amol Grover <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent a14fbcd commit 7013908

File tree

1 file changed

+4
-3
lines changed

1 file changed

+4
-3
lines changed

net/ipv4/ipmr.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,10 @@ static void mroute_clean_tables(struct mr_table *mrt, int flags);
109109
static void ipmr_expire_process(struct timer_list *t);
110110

111111
#ifdef CONFIG_IP_MROUTE_MULTIPLE_TABLES
112-
#define ipmr_for_each_table(mrt, net) \
113-
list_for_each_entry_rcu(mrt, &net->ipv4.mr_tables, list, \
114-
lockdep_rtnl_is_held())
112+
#define ipmr_for_each_table(mrt, net) \
113+
list_for_each_entry_rcu(mrt, &net->ipv4.mr_tables, list, \
114+
lockdep_rtnl_is_held() || \
115+
list_empty(&net->ipv4.mr_tables))
115116

116117
static struct mr_table *ipmr_mr_table_iter(struct net *net,
117118
struct mr_table *mrt)

0 commit comments

Comments
 (0)