Check for __mprotect failure in _dl_map_segments [BZ #20831]
authorDmitry V. Levin <ldv@altlinux.org>
Wed, 16 Nov 2016 22:49:25 +0000 (22:49 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Sun, 9 Apr 2017 23:34:33 +0000 (23:34 +0000)
* elf/dl-map-segments.h (_dl_map_segments): Check for failure
of __mprotect to change protection on the excess portion
to disallow all access.

ChangeLog
elf/dl-map-segments.h

index b72d521..b7c2baf 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2017-04-09  Dmitry V. Levin  <ldv@altlinux.org>
+
+       [BZ #20831]
+       * elf/dl-map-segments.h (_dl_map_segments): Check for failure
+       of __mprotect to change protection on the excess portion
+       to disallow all access.
+
 2017-04-07  H.J. Lu  <hongjiu.lu@intel.com>
 
        * sysdeps/i386/fpu/fclrexcpt.c (__feclearexcept): Use
index 31d6861..d36f9bd 100644 (file)
@@ -64,14 +64,18 @@ _dl_map_segments (struct link_map *l, int fd,
       l->l_addr = l->l_map_start - c->mapstart;
 
       if (has_holes)
-        /* Change protection on the excess portion to disallow all access;
-           the portions we do not remap later will be inaccessible as if
-           unallocated.  Then jump into the normal segment-mapping loop to
-           handle the portion of the segment past the end of the file
-           mapping.  */
-        __mprotect ((caddr_t) (l->l_addr + c->mapend),
-                    loadcmds[nloadcmds - 1].mapstart - c->mapend,
-                    PROT_NONE);
+        {
+          /* Change protection on the excess portion to disallow all access;
+             the portions we do not remap later will be inaccessible as if
+             unallocated.  Then jump into the normal segment-mapping loop to
+             handle the portion of the segment past the end of the file
+             mapping.  */
+          if (__glibc_unlikely
+              (__mprotect ((caddr_t) (l->l_addr + c->mapend),
+                           loadcmds[nloadcmds - 1].mapstart - c->mapend,
+                           PROT_NONE) < 0))
+            return DL_MAP_SEGMENTS_ERROR_MPROTECT;
+        }
 
       l->l_contiguous = 1;