xfrm: fix rcu usage in xfrm_get_type_offload
request_module can sleep, thus we cannot hold rcu_read_lock() while
calling it. The function also jumps back and takes rcu_read_lock()
again (in xfrm_state_get_afinfo()), resulting in an imbalance.
This codepath is triggered whenever a new offloaded state is created.
Fixes: ffdb5211da
("xfrm: Auto-load xfrm offload modules")
Reported-by: syzbot+ca425f44816d749e8eb49755567a75ee48cf4a30@syzkaller.appspotmail.com
Signed-off-by: Sabrina Dubroca <sd@queasysnail.net>
Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
This commit is contained in:
parent
4e765b4972
commit
2f10a61cee
|
@ -313,13 +313,14 @@ retry:
|
||||||
if ((type && !try_module_get(type->owner)))
|
if ((type && !try_module_get(type->owner)))
|
||||||
type = NULL;
|
type = NULL;
|
||||||
|
|
||||||
|
rcu_read_unlock();
|
||||||
|
|
||||||
if (!type && try_load) {
|
if (!type && try_load) {
|
||||||
request_module("xfrm-offload-%d-%d", family, proto);
|
request_module("xfrm-offload-%d-%d", family, proto);
|
||||||
try_load = 0;
|
try_load = 0;
|
||||||
goto retry;
|
goto retry;
|
||||||
}
|
}
|
||||||
|
|
||||||
rcu_read_unlock();
|
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue