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>
This commit is contained in:
Родитель
ee5c23176f
Коммит
3a9016f97f
|
@ -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]--;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче