diff --git a/kernel/static_call_inline.c b/kernel/static_call_inline.c index b80a507c1263819e154bcbbac60546925e296305..0e5794cdf56cfa5d15fac24de72e7360344790d2 100644 --- a/kernel/static_call_inline.c +++ b/kernel/static_call_inline.c @@ -405,6 +405,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;