diff --git a/kernel/static_call.c b/kernel/static_call.c index 43ba0b1e0edbb935782675284e0d1cd28846f12b..e8d1fdec433c393da96480b17b6eb11e56ab8ba2 100644 --- a/kernel/static_call.c +++ b/kernel/static_call.c @@ -400,6 +400,17 @@ static void static_call_del_module(struct module *mod) for (site = start; site < stop; site++) { key = static_call_key(site); + + /* + * If the key was not updated due to a memory allocation + * failure in __static_call_init() then treating key::sites + * as key::mods in the code below would cause random memory + * access and #GP. In that case all subsequent sites have + * not been touched either, so stop iterating. + */ + if (!static_call_key_has_mods(key)) + break; + if (key == prev_key) continue;