aboutsummaryrefslogtreecommitdiffstats
path: root/tools/libxc/xc_load_elf.c
diff options
context:
space:
mode:
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>2006-06-30 22:19:08 +0100
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>2006-06-30 22:19:08 +0100
commit6b4c5ff3c8f460130e70afdfda1e5424cf22f8e4 (patch)
treebad12cb9a2c583e27ab1a49e95637bf1ca55b372 /tools/libxc/xc_load_elf.c
parentf4c633d8ecdaaab087585bc284cb5db28b10f5c4 (diff)
downloadxen-6b4c5ff3c8f460130e70afdfda1e5424cf22f8e4.tar.gz
xen-6b4c5ff3c8f460130e70afdfda1e5424cf22f8e4.tar.bz2
xen-6b4c5ff3c8f460130e70afdfda1e5424cf22f8e4.zip
Provide more specific and helpful error messages during ELF loading.
Signed-off-by: Jimi Xenidis <jimix@watson.ibm.com> Signed-off-by: Hollis Blanchard <hollisb@us.ibm.com>
Diffstat (limited to 'tools/libxc/xc_load_elf.c')
-rw-r--r--tools/libxc/xc_load_elf.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/tools/libxc/xc_load_elf.c b/tools/libxc/xc_load_elf.c
index fac1df0a6a..c005409924 100644
--- a/tools/libxc/xc_load_elf.c
+++ b/tools/libxc/xc_load_elf.c
@@ -170,7 +170,11 @@ static int parseelfimage(const char *image,
elf_pa_off = elf_pa_off_defined ? strtoull(p+17, &p, 0) : virt_base;
if ( elf_pa_off_defined && !virt_base_defined )
- goto bad_image;
+ {
+ ERROR("Neither ELF_PADDR_OFFSET nor VIRT_BASE found in __xen_guest"
+ " section.");
+ return -EINVAL;
+ }
for ( h = 0; h < ehdr->e_phnum; h++ )
{
@@ -179,7 +183,11 @@ static int parseelfimage(const char *image,
continue;
vaddr = phdr->p_paddr - elf_pa_off + virt_base;
if ( (vaddr + phdr->p_memsz) < vaddr )
- goto bad_image;
+ {
+ ERROR("ELF program header %d is too large.", h);
+ return -EINVAL;
+ }
+
if ( vaddr < kernstart )
kernstart = vaddr;
if ( (vaddr + phdr->p_memsz) > kernend )
@@ -202,7 +210,10 @@ static int parseelfimage(const char *image,
(dsi->v_kernentry < kernstart) ||
(dsi->v_kernentry > kernend) ||
(dsi->v_start > kernstart) )
- goto bad_image;
+ {
+ ERROR("ELF start or entries are out of bounds.");
+ return -EINVAL;
+ }
if ( (p = strstr(guestinfo, "BSD_SYMTAB")) != NULL )
dsi->load_symtab = 1;
@@ -214,10 +225,6 @@ static int parseelfimage(const char *image,
loadelfsymtab(image, 0, 0, NULL, dsi);
return 0;
-
- bad_image:
- ERROR("Malformed ELF image.");
- return -EINVAL;
}
static int