summaryrefslogtreecommitdiff
path: root/libexec
diff options
context:
space:
mode:
authormaya <maya@NetBSD.org>2017-03-10 09:13:49 +0000
committermaya <maya@NetBSD.org>2017-03-10 09:13:49 +0000
commit2c714d60fdb7fe09adcc3e0d6dfc1ecabe6269e2 (patch)
tree0bb0857c114594e338083c830c22f7d7d95b4e5f /libexec
parent39c0b957303106deee61d5b7be58a4525cb03683 (diff)
Revert to version 1.55 of map_object.c. This reverts:
"really unmap the gap between the text and data rather than just removing all access with mprotect(). the latter results in the kernel having to keep track of that range separately since the permissions are different. avoid calling mmap() with a size of zero." As per toolchain/52054: src/libexec/ld.elf_so update breaks everything, this commit is very broken for some people (but not others). chs mentioned he has a fix, but best not to leave -current broken in the meantime.
Diffstat (limited to 'libexec')
-rw-r--r--libexec/ld.elf_so/map_object.c16
1 files changed, 6 insertions, 10 deletions
diff --git a/libexec/ld.elf_so/map_object.c b/libexec/ld.elf_so/map_object.c
index 6c555ed5879..9fc265b82fd 100644
--- a/libexec/ld.elf_so/map_object.c
+++ b/libexec/ld.elf_so/map_object.c
@@ -1,4 +1,4 @@
-/* $NetBSD: map_object.c,v 1.56 2017/03/09 00:43:50 chs Exp $ */
+/* $NetBSD: map_object.c,v 1.57 2017/03/10 09:13:49 maya Exp $ */
/*
* Copyright 1996 John D. Polstra.
@@ -34,7 +34,7 @@
#include <sys/cdefs.h>
#ifndef lint
-__RCSID("$NetBSD: map_object.c,v 1.56 2017/03/09 00:43:50 chs Exp $");
+__RCSID("$NetBSD: map_object.c,v 1.57 2017/03/10 09:13:49 maya Exp $");
#endif /* not lint */
#include <errno.h>
@@ -88,10 +88,8 @@ _rtld_map_object(const char *path, int fd, const struct stat *sb)
Elf_Off data_offset;
Elf_Addr data_vaddr;
Elf_Addr data_vlimit;
- size_t data_size;
int data_flags;
caddr_t data_addr;
- size_t bss_size;
#if defined(__HAVE_TLS_VARIANT_I) || defined(__HAVE_TLS_VARIANT_II)
Elf_Addr tls_vaddr = 0; /* Noise GCC */
#endif
@@ -363,8 +361,7 @@ _rtld_map_object(const char *path, int fd, const struct stat *sb)
/* Overlay the data segment onto the proper region. */
data_addr = mapbase + (data_vaddr - base_vaddr);
- data_size = data_vlimit - data_vaddr;
- if (data_size != 0 && mmap(data_addr, data_size, data_flags,
+ if (mmap(data_addr, data_vlimit - data_vaddr, data_flags,
MAP_FILE | MAP_PRIVATE | MAP_FIXED, fd, data_offset) ==
MAP_FAILED) {
_rtld_error("mmap of data failed: %s", xstrerror(errno));
@@ -372,8 +369,7 @@ _rtld_map_object(const char *path, int fd, const struct stat *sb)
}
/* Overlay the bss segment onto the proper region. */
- bss_size = base_vlimit - data_vlimit;
- if (bss_size != 0 && mmap(mapbase + data_vlimit - base_vaddr, bss_size,
+ if (mmap(mapbase + data_vlimit - base_vaddr, base_vlimit - data_vlimit,
data_flags, MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0) ==
MAP_FAILED) {
_rtld_error("mmap of bss failed: %s", xstrerror(errno));
@@ -383,8 +379,8 @@ _rtld_map_object(const char *path, int fd, const struct stat *sb)
/* Unmap the gap between the text and data. */
gap_addr = mapbase + round_up(text_vlimit - base_vaddr);
gap_size = data_addr - gap_addr;
- if (gap_size != 0 && munmap(gap_addr, gap_size) == -1) {
- _rtld_error("munmap of text -> data gap failed: %s",
+ if (gap_size != 0 && mprotect(gap_addr, gap_size, PROT_NONE) == -1) {
+ _rtld_error("mprotect of text -> data gap failed: %s",
xstrerror(errno));
goto bad;
}