[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