[PATCH v2] loader: check return values of wld_mprotect and wld_mmap calls
Paul Gofman
gofmanp at gmail.com
Tue Dec 22 05:22:58 CST 2015
Fixes loader crash when compiled using Intel compiler (icc 16.0.1 20151021).
Signed-off-by: Paul Gofman <gofmanp at gmail.com>
---
loader/preloader.c | 26 +++++++++++++++++---------
1 file changed, 17 insertions(+), 9 deletions(-)
diff --git a/loader/preloader.c b/loader/preloader.c
index 25aaacd..2e1f7af 100644
--- a/loader/preloader.c
+++ b/loader/preloader.c
@@ -813,15 +813,18 @@ static void map_so_lib( const char *name, struct wld_link_map *l)
l->l_map_start = (ElfW(Addr)) wld_mmap ((void *) mappref, maplength,
c->prot, MAP_COPY | MAP_FILE,
fd, c->mapoff);
+ if (l->l_map_start == -1)
+ fatal_error("wld_mmap error\n");
/* wld_printf("set : offset = %x\n", c->mapoff); */
/* wld_printf("l->l_map_start = %x\n", l->l_map_start); */
l->l_map_end = l->l_map_start + maplength;
l->l_addr = l->l_map_start - c->mapstart;
- wld_mprotect ((caddr_t) (l->l_addr + c->mapend),
+ if (wld_mprotect ((caddr_t) (l->l_addr + c->mapend),
loadcmds[nloadcmds - 1].allocend - c->mapend,
- PROT_NONE);
+ PROT_NONE) != 0)
+ fatal_error("wld_mprotect error\n");
goto postmap;
}
else
@@ -843,9 +846,10 @@ static void map_so_lib( const char *name, struct wld_link_map *l)
{
if (c->mapend > c->mapstart)
/* Map the segment contents from the file. */
- wld_mmap ((void *) (l->l_addr + c->mapstart),
+ if (wld_mmap ((void *) (l->l_addr + c->mapstart),
c->mapend - c->mapstart, c->prot,
- MAP_FIXED | MAP_COPY | MAP_FILE, fd, c->mapoff);
+ MAP_FIXED | MAP_COPY | MAP_FILE, fd, c->mapoff) == MAP_FAILED)
+ fatal_error("wld_mmap error\n");
postmap:
if (l->l_phdr == 0
@@ -884,19 +888,22 @@ static void map_so_lib( const char *name, struct wld_link_map *l)
if ((c->prot & PROT_WRITE) == 0)
{
/* Dag nab it. */
- wld_mprotect ((caddr_t) (zero & ~page_mask), page_size, c->prot|PROT_WRITE);
+ if (wld_mprotect ((caddr_t) (zero & ~page_mask), page_size, c->prot|PROT_WRITE) != 0)
+ fatal_error("wld_mprotect error\n");
}
wld_memset ((void *) zero, '\0', zeropage - zero);
if ((c->prot & PROT_WRITE) == 0)
- wld_mprotect ((caddr_t) (zero & ~page_mask), page_size, c->prot);
+ if (wld_mprotect ((caddr_t) (zero & ~page_mask), page_size, c->prot) != 0)
+ fatal_error("wld_mprotect error\n");
}
if (zeroend > zeropage)
{
/* Map the remaining zero pages in from the zero fill FD. */
- wld_mmap ((caddr_t) zeropage, zeroend - zeropage,
+ if (wld_mmap ((caddr_t) zeropage, zeroend - zeropage,
c->prot, MAP_ANON|MAP_PRIVATE|MAP_FIXED,
- -1, 0);
+ -1, 0) == MAP_FAILED)
+ fatal_error("wld_mmap error\n");
}
}
@@ -1220,7 +1227,8 @@ void* wld_start( void **stack )
/* add an executable page at the top of the address space to defeat
* broken no-exec protections that play with the code selector limit */
if (is_addr_reserved( (char *)0x80000000 - page_size ))
- wld_mprotect( (char *)0x80000000 - page_size, page_size, PROT_EXEC | PROT_READ );
+ if (wld_mprotect( (char *)0x80000000 - page_size, page_size, PROT_EXEC | PROT_READ ) != 0)
+ fatal_error("wld_mprotect error\n");
/* load the main binary */
map_so_lib( argv[1], &main_binary_map );
--
2.5.0
More information about the wine-patches
mailing list