summaryrefslogtreecommitdiffstats
path: root/net/xfrm
diff options
context:
space:
mode:
authorSteffen Klassert <steffen.klassert@secunet.com>2014-02-19 10:07:34 +0100
committerSteffen Klassert <steffen.klassert@secunet.com>2014-02-26 09:52:02 +0100
commit3a9016f97fdc8bfbb26ff36ba8f3dc9162eb691b (patch)
tree29319c7ec9ab7035398c1bef2bdbccd3cee718a2 /net/xfrm
parentxfrm: Clone states properly on migration (diff)
downloadlinux-3a9016f97fdc8bfbb26ff36ba8f3dc9162eb691b.tar.xz
linux-3a9016f97fdc8bfbb26ff36ba8f3dc9162eb691b.zip
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>
Diffstat (limited to 'net/xfrm')
-rw-r--r--net/xfrm/xfrm_policy.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c
index 4b98b25793c5..1d5c7bf29938 100644
--- a/net/xfrm/xfrm_policy.c
+++ b/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))
return NULL;
- hlist_del(&pol->bydst);
+ hlist_del_init(&pol->bydst);
hlist_del(&pol->byidx);
list_del(&pol->walk.all);
net->xfrm.policy_count[dir]--;