[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v12 08/12] linux-user/elfload: Use Error for load_elf_image
From: |
Richard Henderson |
Subject: |
[PATCH v12 08/12] linux-user/elfload: Use Error for load_elf_image |
Date: |
Wed, 21 Oct 2020 10:37:45 -0700 |
This is a bit clearer than open-coding some of this
with a bare c string.
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
linux-user/elfload.c | 37 ++++++++++++++++++++-----------------
1 file changed, 20 insertions(+), 17 deletions(-)
diff --git a/linux-user/elfload.c b/linux-user/elfload.c
index 107a628a9e..56fbda93d0 100644
--- a/linux-user/elfload.c
+++ b/linux-user/elfload.c
@@ -12,6 +12,7 @@
#include "qemu/guest-random.h"
#include "qemu/units.h"
#include "qemu/selfmap.h"
+#include "qapi/error.h"
#ifdef _ARCH_PPC64
#undef ARCH_DLINFO
@@ -2392,15 +2393,16 @@ static void load_elf_image(const char *image_name, int
image_fd,
struct elf_phdr *phdr;
abi_ulong load_addr, load_bias, loaddr, hiaddr, error;
int i, retval;
- const char *errmsg;
+ Error *err = NULL;
/* First of all, some simple consistency checks */
- errmsg = "Invalid ELF image for this architecture";
if (!elf_check_ident(ehdr)) {
+ error_setg(&err, "Invalid ELF image for this architecture");
goto exit_errmsg;
}
bswap_ehdr(ehdr);
if (!elf_check_ehdr(ehdr)) {
+ error_setg(&err, "Invalid ELF image for this architecture");
goto exit_errmsg;
}
@@ -2444,13 +2446,11 @@ static void load_elf_image(const char *image_name, int
image_fd,
g_autofree char *interp_name = NULL;
if (*pinterp_name) {
- errmsg = "Multiple PT_INTERP entries";
+ error_setg(&err, "Multiple PT_INTERP entries");
goto exit_errmsg;
}
+
interp_name = g_malloc(eppnt->p_filesz);
- if (!interp_name) {
- goto exit_perror;
- }
if (eppnt->p_offset + eppnt->p_filesz <= BPRM_BUF_SIZE) {
memcpy(interp_name, bprm_buf + eppnt->p_offset,
@@ -2459,11 +2459,11 @@ static void load_elf_image(const char *image_name, int
image_fd,
retval = pread(image_fd, interp_name, eppnt->p_filesz,
eppnt->p_offset);
if (retval != eppnt->p_filesz) {
- goto exit_perror;
+ goto exit_read;
}
}
if (interp_name[eppnt->p_filesz - 1] != 0) {
- errmsg = "Invalid PT_INTERP entry";
+ error_setg(&err, "Invalid PT_INTERP entry");
goto exit_errmsg;
}
*pinterp_name = g_steal_pointer(&interp_name);
@@ -2520,7 +2520,7 @@ static void load_elf_image(const char *image_name, int
image_fd,
(ehdr->e_type == ET_EXEC ? MAP_FIXED : 0),
-1, 0);
if (load_addr == -1) {
- goto exit_perror;
+ goto exit_mmap;
}
load_bias = load_addr - loaddr;
@@ -2587,7 +2587,7 @@ static void load_elf_image(const char *image_name, int
image_fd,
image_fd, eppnt->p_offset - vaddr_po);
if (error == -1) {
- goto exit_perror;
+ goto exit_mmap;
}
}
@@ -2623,7 +2623,7 @@ static void load_elf_image(const char *image_name, int
image_fd,
} else if (eppnt->p_type == PT_MIPS_ABIFLAGS) {
Mips_elf_abiflags_v0 abiflags;
if (eppnt->p_filesz < sizeof(Mips_elf_abiflags_v0)) {
- errmsg = "Invalid PT_MIPS_ABIFLAGS entry";
+ error_setg(&err, "Invalid PT_MIPS_ABIFLAGS entry");
goto exit_errmsg;
}
if (eppnt->p_offset + eppnt->p_filesz <= BPRM_BUF_SIZE) {
@@ -2633,7 +2633,7 @@ static void load_elf_image(const char *image_name, int
image_fd,
retval = pread(image_fd, &abiflags,
sizeof(Mips_elf_abiflags_v0),
eppnt->p_offset);
if (retval != sizeof(Mips_elf_abiflags_v0)) {
- goto exit_perror;
+ goto exit_read;
}
}
bswap_mips_abiflags(&abiflags);
@@ -2658,13 +2658,16 @@ static void load_elf_image(const char *image_name, int
image_fd,
exit_read:
if (retval >= 0) {
- errmsg = "Incomplete read of file header";
- goto exit_errmsg;
+ error_setg(&err, "Incomplete read of file header");
+ } else {
+ error_setg_errno(&err, errno, "Error reading file header");
}
- exit_perror:
- errmsg = strerror(errno);
+ goto exit_errmsg;
+ exit_mmap:
+ error_setg_errno(&err, errno, "Error mapping file");
+ goto exit_errmsg;
exit_errmsg:
- fprintf(stderr, "%s: %s\n", image_name, errmsg);
+ error_reportf_err(err, "%s: ", image_name);
exit(-1);
}
--
2.25.1
- [PATCH v12 00/12] linux-user: User support for AArch64 BTI, Richard Henderson, 2020/10/21
- [PATCH v12 02/12] linux-user: Set PAGE_TARGET_1 for TARGET_PROT_BTI, Richard Henderson, 2020/10/21
- [PATCH v12 06/12] linux-user/elfload: Adjust iteration over phdr, Richard Henderson, 2020/10/21
- [PATCH v12 07/12] linux-user/elfload: Move PT_INTERP detection to first loop, Richard Henderson, 2020/10/21
- [PATCH v12 04/12] linux-user/elfload: Avoid leaking interp_name using GLib memory API, Richard Henderson, 2020/10/21
- [PATCH v12 01/12] linux-user/aarch64: Reset btype for signals, Richard Henderson, 2020/10/21
- [PATCH v12 10/12] linux-user/elfload: Parse NT_GNU_PROPERTY_TYPE_0 notes, Richard Henderson, 2020/10/21
- [PATCH v12 12/12] tests/tcg/aarch64: Add bti smoke tests, Richard Henderson, 2020/10/21
- [PATCH v12 05/12] linux-user/elfload: Fix coding style in load_elf_image, Richard Henderson, 2020/10/21
- [PATCH v12 09/12] linux-user/elfload: Use Error for load_elf_interp, Richard Henderson, 2020/10/21
- [PATCH v12 08/12] linux-user/elfload: Use Error for load_elf_image,
Richard Henderson <=
- [PATCH v12 11/12] linux-user/elfload: Parse GNU_PROPERTY_AARCH64_FEATURE_1_AND, Richard Henderson, 2020/10/21
- [PATCH v12 03/12] include/elf: Add defines related to GNU property notes for AArch64, Richard Henderson, 2020/10/21
- Re: [PATCH v12 00/12] linux-user: User support for AArch64 BTI, no-reply, 2020/10/21
- Re: [PATCH v12 00/12] linux-user: User support for AArch64 BTI, Peter Maydell, 2020/10/26