Thank you for your contribution! Sashiko AI review found 1 potential issue(s) 
to consider:
- [High] Partial relocations are not reverted when apply_relocate_add() fails 
midway, leading to permanent state corruption.
--

commit 3f6df1b4ed699e839abbdc8919a6c7de5d1850c8
Author: Petr Mladek <[email protected]>

livepatch: Clean up klp_init_object_loaded() when fails

When loading a module, klp_module_coming() updates all enabled patches.
If an error occurs, klp_cleanup_module_patches_limited() cleans up fully
processed patches, but skips the patch that failed midway. This commit
updates klp_free_object_loaded() to revert all and only changes made by
klp_init_object_loaded().

Closes: https://lore.kernel.org/r/[email protected]
Closes: https://lore.kernel.org/r/[email protected]

> Next, klp_init_object_loaded() has to clear its own changes on
> failure. It just returns an error when relocations failed because
> they clear their own mess. It could call klp_free_object_loaded()
> in other situations because all relocations were done and other
> values are just cleared.

[Severity: High]
Does this actually clear its own mess completely? Looking at how relocations
are rolled back in klp_write_object_relocs_limited(), which was introduced
earlier in this series:

kernel/livepatch/core.c:klp_write_object_relocs_limited() {
    ...
                ret = klp_write_section_relocs(patch->mod, info->sechdrs,
                                               info->secstrings,
                                               patch->mod->core_kallsyms.strtab,
                                               info->symndx, i, obj->name, 
apply);
                if (ret) {
                        if (apply)
                                klp_write_object_relocs_limited(patch, obj, 
false, i);
                        return ret;
                }
    ...
}

By passing i as the limit to the rollback function, the rollback loop:

        for (i = 1; i < limit; i++) {

will terminate at i - 1. Doesn't this skip the rollback for the partially
applied section i?

If apply_relocate_add succeeds on relocations 0 to k-1 in section i, but
fails on relocation k, these partial relocations remain permanently applied
in the livepatch module's text. 

Subsequent attempts to load the target module will fail immediately at
relocation 0 due to non-zero target memory, converting a potentially transient
address-space layout failure into a permanent -ENOEXEC on retry.

-- 
Sashiko AI review ยท 
https://sashiko.dev/#/patchset/[email protected]?part=5

Reply via email to