• Jessica Yu's avatar
    livepatch/x86: apply alternatives and paravirt patches after relocations · d4c3e6e1
    Jessica Yu authored
    Implement arch_klp_init_object_loaded() for x86, which applies
    alternatives/paravirt patches. This fixes the order in which relocations
    and alternatives/paravirt patches are applied.
    
    Previously, if a patch module had alternatives or paravirt patches,
    these were applied first by the module loader before livepatch can apply
    per-object relocations. The (buggy) sequence of events was:
    
    (1) Load patch module
    (2) Apply alternatives and paravirt patches to patch module
        * Note that these are applied to the new functions in the patch module
    (3) Apply per-object relocations to patch module when target module loads.
        * This clobbers what was written in step 2
    
    This lead to crashes and corruption in general, since livepatch would
    overwrite or step on previously applied alternative/paravirt patches.
    The correct sequence of events should be:
    
    (1) Load patch module
    (2) Apply per-object relocations to patch module
    (3) Apply alternatives and paravirt patches to patch module
    
    This is fixed by delaying paravirt/alternatives patching until after
    relocations are applied. Any .altinstructions or .parainstructions
    sections are prefixed with ".klp.arch.${objname}" and applied in
    arch_klp_init_object_loaded().
    Signed-off-by: default avatarJessica Yu <jeyu@redhat.com>
    Acked-by: default avatarMiroslav Benes <mbenes@suse.cz>
    Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
    d4c3e6e1
livepatch.c 1.94 KB