This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH v2] Check for __mprotect failure in _dl_map_segments [BZ #20831]
- From: "Dmitry V. Levin" <ldv at altlinux dot org>
- To: libc-alpha at sourceware dot org
- Date: Tue, 21 Mar 2017 17:20:28 +0300
- Subject: [PATCH v2] Check for __mprotect failure in _dl_map_segments [BZ #20831]
- Authentication-results: sourceware.org; auth=none
- References: <20161116234522.GA8065@altlinux.org> <20161227130144.GC1603@altlinux.org> <20170320193558.GB26547@altlinux.org> <CAKCAbMh6hrOy=TvCmR+DCU6JXUiZWtZYvfpE4zhaZAfp2RZjzQ@mail.gmail.com> <20170320202710.GA26800@altlinux.org> <CAKCAbMj=cd3=iBLMhMteXk6POBkczzOmpsWok7g493uCgMeNEg@mail.gmail.com>
* elf/dl-map-segments.h (_dl_map_segments): Check for failure
of __mprotect to change protection on the excess portion
to disallow all access.
---
v2: change formatting of __glibc_unlikely as suggested by Zack Weinberg
---
ChangeLog | 7 +++++++
elf/dl-map-segments.h | 20 ++++++++++++--------
2 files changed, 19 insertions(+), 8 deletions(-)
diff --git a/elf/dl-map-segments.h b/elf/dl-map-segments.h
index 31d6861..d36f9bd 100644
--- a/elf/dl-map-segments.h
+++ b/elf/dl-map-segments.h
@@ -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;
--
ldv