net_sched: reorder pernet ops and act ops registrations
authorWANG Cong <xiyou.wangcong@gmail.com>
Tue, 11 Oct 2016 17:56:45 +0000 (10:56 -0700)
committerDavid S. Miller <davem@davemloft.net>
Thu, 13 Oct 2016 14:26:43 +0000 (10:26 -0400)
commitab102b80cef28c20b3ef7794806c3a982c6444fc
treef1f4ef200fb7180cccc07d88978c1d4ff42aae92
parentd1ef006dc116bf6487426b0b50c1bf2bf51e6423
net_sched: reorder pernet ops and act ops registrations

Krister reported a kernel NULL pointer dereference after
tcf_action_init_1() invokes a_o->init(), it is a race condition
where one thread calling tcf_register_action() to initialize
the netns data after putting act ops in the global list and
the other thread searching the list and then calling
a_o->init(net, ...).

Fix this by moving the pernet ops registration before making
the action ops visible. This is fine because: a) we don't
rely on act_base in pernet ops->init(), b) in the worst case we
have a fully initialized netns but ops is still not ready so
new actions still can't be created.

Reported-by: Krister Johansen <kjlx@templeofstupid.com>
Tested-by: Krister Johansen <kjlx@templeofstupid.com>
Cc: Jamal Hadi Salim <jhs@mojatatu.com>
Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>
Acked-by: Jamal Hadi Salim <jhs@mojatatu.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/sched/act_api.c