linux-user/elfload: Use Error for load_elf_image
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> Message-id: 20201021173749.111103-9-richard.henderson@linaro.org Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
8a1a5274c9
commit
c7f17e7bd7
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user