From: Heiko Carstens <hca@linux.ibm.com>
To: Philipp Rudo <prudo@redhat.com>
Cc: linux-s390@vger.kernel.org, egorenar@linux.ibm.com, ltao@redhat.com
Subject: Re: [PATCH] s390/kexec_file: fix error handling when applying relocations
Date: Mon, 6 Dec 2021 18:13:43 +0100 [thread overview]
Message-ID: <Ya5Ex8WPeyiPwXl+@osiris> (raw)
In-Reply-To: <20211206112047.4746-1-prudo@redhat.com>
On Mon, Dec 06, 2021 at 12:20:47PM +0100, Philipp Rudo wrote:
> 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@redhat.com>
> Signed-off-by: Philipp Rudo <prudo@redhat.com>
> ---
> arch/s390/kernel/machine_kexec_file.c | 5 ++++-
> 1 file changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/arch/s390/kernel/machine_kexec_file.c b/arch/s390/kernel/machine_kexec_file.c
> index 9975ad200d74..0e1d646207dc 100644
> --- a/arch/s390/kernel/machine_kexec_file.c
> +++ b/arch/s390/kernel/machine_kexec_file.c
> @@ -292,6 +292,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;
>
> @@ -326,7 +327,9 @@ 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)
> + return -EINVAL;
I'd prefer if this would return -ENOEXEC, just to be consistent with
x86. And _maybe_ it would also make sense to print an error message,
including the failing relocation type?
Thanks,
Heiko
next prev parent reply other threads:[~2021-12-06 17:13 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-12-06 11:20 [PATCH] s390/kexec_file: fix error handling when applying relocations Philipp Rudo
2021-12-06 17:13 ` Heiko Carstens [this message]
2021-12-06 17:33 ` Philipp Rudo
2021-12-06 18:36 ` Heiko Carstens
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Ya5Ex8WPeyiPwXl+@osiris \
--to=hca@linux.ibm.com \
--cc=egorenar@linux.ibm.com \
--cc=linux-s390@vger.kernel.org \
--cc=ltao@redhat.com \
--cc=prudo@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.