On Fri, Aug 28, 2026 at 5:53 AM Petr Mladek <[email protected]> wrote:
>
> When a module is loaded, klp_module_coming() iterates over patches and
> calls klp_init_object_loaded(). If initialization fails, it delegates
> cleanup to klp_cleanup_module_patches_limited().
>
> However, the cleanup loop skips the failing patch. Each function called
> in klp_init_object_loaded() is supposed to clean its own changes. This
> works except for the changes done by klp_init_object_loaded().
>
> The current code is a bit messy. The changes done by
> klp_init_object_loaded() should get cleared by klp_free_object_loaded().
> But this function also clears obj->mod which is set by
> klp_module_coming(). And relocations are cleared separately.
>
> Fix the situations by updating klp_free_object_loaded(). It should
> revert all and only changes made by klp_init_object_loaded().
> This requires some shuffling:
>
>  + Clear obj->mod explicitly in klp_cleanup_module_patches_limited()
>    and do not rely on klp_free_object_loaded().
>
>  + Clear relocations in klp_free_object_loaded(). Remove the explicit
>    call from klp_cleanup_module_patches_limited(). This requires
>    adding the @patch parameter.
>
> Finally, call klp_free_object_loaded() in the error path in
> klp_init_object_loaded().
>
> Reported-by: [email protected]
> Closes: https://lore.kernel.org/r/[email protected]
> Signed-off-by: Petr Mladek <[email protected]>

Acked-by: Song Liu <[email protected]>

With one nitpick

> ---
>  kernel/livepatch/core.c | 30 ++++++++++++++++++++----------
>  1 file changed, 20 insertions(+), 10 deletions(-)
>
> diff --git a/kernel/livepatch/core.c b/kernel/livepatch/core.c
> index cdb25949f73b..1e59a3cc0895 100644
> --- a/kernel/livepatch/core.c
> +++ b/kernel/livepatch/core.c
> @@ -725,18 +725,20 @@ static void __klp_free_funcs(struct klp_object *obj, 
> bool nops_only)
>  }
>
>  /* Clean up when a patched object is unloaded */
> -static void klp_free_object_loaded(struct klp_object *obj)
> +static void klp_free_object_loaded(struct klp_patch *patch,
> +                                  struct klp_object *obj)

nit: Do we still need to fit every line in 80 characters? checkpatch.pl
only enforce 100 characters these days.

Thanks
Song

>  {
>         struct klp_func *func;

[...]

Reply via email to