Browse Source

xfrm: Fix unlink race when policies are deleted.

When a policy is unlinked from the lists in thread context,
the xfrm timer can fire before we can mark this policy as dead.
So reinitialize the bydst hlist, then hlist_unhashed() will
notice that this policy is not linked and will avoid a
doulble unlink of that policy.

Reported-by: Xianpeng Zhao <673321875@qq.com>
Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
Steffen Klassert 11 years ago
parent
commit
3a9016f97f
1 changed files with 1 additions and 1 deletions
  1. 1 1
      net/xfrm/xfrm_policy.c

+ 1 - 1
net/xfrm/xfrm_policy.c

@@ -1158,7 +1158,7 @@ static struct xfrm_policy *__xfrm_policy_unlink(struct xfrm_policy *pol,
 	if (hlist_unhashed(&pol->bydst))
 	if (hlist_unhashed(&pol->bydst))
 		return NULL;
 		return NULL;
 
 
-	hlist_del(&pol->bydst);
+	hlist_del_init(&pol->bydst);
 	hlist_del(&pol->byidx);
 	hlist_del(&pol->byidx);
 	list_del(&pol->walk.all);
 	list_del(&pol->walk.all);
 	net->xfrm.policy_count[dir]--;
 	net->xfrm.policy_count[dir]--;