mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-06 10:00:17 +00:00
xfrm: check all hash buckets for leftover states during netns deletion
The current hlist_empty checks only test the first bucket of each hashtable, ignoring any other bucket. They should be caught by the WARN_ON for state_all, but better to make all the checks accurate. Fixes:73d189dce4("netns xfrm: per-netns xfrm_state_bydst hash") Fixes:d320bbb306("netns xfrm: per-netns xfrm_state_bysrc hash") Fixes:b754a4fd8f("netns xfrm: per-netns xfrm_state_byspi hash") Fixes:fe9f1d8779("xfrm: add state hashtable keyed by seq") Signed-off-by: Sabrina Dubroca <sd@queasysnail.net> Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
This commit is contained in:
committed by
Steffen Klassert
parent
1dcf617bec
commit
f2bc8231fd
@@ -3308,6 +3308,7 @@ out_bydst:
|
|||||||
void xfrm_state_fini(struct net *net)
|
void xfrm_state_fini(struct net *net)
|
||||||
{
|
{
|
||||||
unsigned int sz;
|
unsigned int sz;
|
||||||
|
int i;
|
||||||
|
|
||||||
flush_work(&net->xfrm.state_hash_work);
|
flush_work(&net->xfrm.state_hash_work);
|
||||||
xfrm_state_flush(net, 0, false);
|
xfrm_state_flush(net, 0, false);
|
||||||
@@ -3315,14 +3316,17 @@ void xfrm_state_fini(struct net *net)
|
|||||||
|
|
||||||
WARN_ON(!list_empty(&net->xfrm.state_all));
|
WARN_ON(!list_empty(&net->xfrm.state_all));
|
||||||
|
|
||||||
|
for (i = 0; i <= net->xfrm.state_hmask; i++) {
|
||||||
|
WARN_ON(!hlist_empty(net->xfrm.state_byseq + i));
|
||||||
|
WARN_ON(!hlist_empty(net->xfrm.state_byspi + i));
|
||||||
|
WARN_ON(!hlist_empty(net->xfrm.state_bysrc + i));
|
||||||
|
WARN_ON(!hlist_empty(net->xfrm.state_bydst + i));
|
||||||
|
}
|
||||||
|
|
||||||
sz = (net->xfrm.state_hmask + 1) * sizeof(struct hlist_head);
|
sz = (net->xfrm.state_hmask + 1) * sizeof(struct hlist_head);
|
||||||
WARN_ON(!hlist_empty(net->xfrm.state_byseq));
|
|
||||||
xfrm_hash_free(net->xfrm.state_byseq, sz);
|
xfrm_hash_free(net->xfrm.state_byseq, sz);
|
||||||
WARN_ON(!hlist_empty(net->xfrm.state_byspi));
|
|
||||||
xfrm_hash_free(net->xfrm.state_byspi, sz);
|
xfrm_hash_free(net->xfrm.state_byspi, sz);
|
||||||
WARN_ON(!hlist_empty(net->xfrm.state_bysrc));
|
|
||||||
xfrm_hash_free(net->xfrm.state_bysrc, sz);
|
xfrm_hash_free(net->xfrm.state_bysrc, sz);
|
||||||
WARN_ON(!hlist_empty(net->xfrm.state_bydst));
|
|
||||||
xfrm_hash_free(net->xfrm.state_bydst, sz);
|
xfrm_hash_free(net->xfrm.state_bydst, sz);
|
||||||
free_percpu(net->xfrm.state_cache_input);
|
free_percpu(net->xfrm.state_cache_input);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user