Patch "s390/kexec_file: fix error handling when applying relocations" has been added to the 5.4-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    s390/kexec_file: fix error handling when applying relocations

to the 5.4-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     s390-kexec_file-fix-error-handling-when-applying-rel.patch
and it can be found in the queue-5.4 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 6c24d0b1a6d5547e54b2b0bfb15ff83c97820299
Author: Philipp Rudo <prudo@xxxxxxxxxx>
Date:   Wed Dec 8 14:07:41 2021 +0100

    s390/kexec_file: fix error handling when applying relocations
    
    [ Upstream commit 41967a37b8eedfee15b81406a9f3015be90d3980 ]
    
    arch_kexec_apply_relocations_add currently ignores all errors returned
    by arch_kexec_do_relocs. This means that every unknown relocation is
    silently skipped causing unpredictable behavior while the relocated code
    runs. Fix this by checking for errors and fail kexec_file_load if an
    unknown relocation type is encountered.
    
    The problem was found after gcc changed its behavior and used
    R_390_PLT32DBL relocations for brasl instruction and relied on ld to
    resolve the relocations in the final link in case direct calls are
    possible. As the purgatory code is only linked partially (option -r)
    ld didn't resolve the relocations leaving them for arch_kexec_do_relocs.
    But arch_kexec_do_relocs doesn't know how to handle R_390_PLT32DBL
    relocations so they were silently skipped. This ultimately caused an
    endless loop in the purgatory as the brasl instructions kept branching
    to itself.
    
    Fixes: 71406883fd35 ("s390/kexec_file: Add kexec_file_load system call")
    Reported-by: Tao Liu <ltao@xxxxxxxxxx>
    Signed-off-by: Philipp Rudo <prudo@xxxxxxxxxx>
    Link: https://lore.kernel.org/r/20211208130741.5821-3-prudo@xxxxxxxxxx
    Signed-off-by: Heiko Carstens <hca@xxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/arch/s390/kernel/machine_kexec_file.c b/arch/s390/kernel/machine_kexec_file.c
index e7435f3a3d2d2..76cd09879eaf4 100644
--- a/arch/s390/kernel/machine_kexec_file.c
+++ b/arch/s390/kernel/machine_kexec_file.c
@@ -277,6 +277,7 @@ int arch_kexec_apply_relocations_add(struct purgatory_info *pi,
 {
 	Elf_Rela *relas;
 	int i, r_type;
+	int ret;
 
 	relas = (void *)pi->ehdr + relsec->sh_offset;
 
@@ -311,7 +312,11 @@ int arch_kexec_apply_relocations_add(struct purgatory_info *pi,
 		addr = section->sh_addr + relas[i].r_offset;
 
 		r_type = ELF64_R_TYPE(relas[i].r_info);
-		arch_kexec_do_relocs(r_type, loc, val, addr);
+		ret = arch_kexec_do_relocs(r_type, loc, val, addr);
+		if (ret) {
+			pr_err("Unknown rela relocation: %d\n", r_type);
+			return -ENOEXEC;
+		}
 	}
 	return 0;
 }



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux