diff options
author | Roland McGrath <roland@gnu.org> | 2005-10-17 20:59:28 +0000 |
---|---|---|
committer | Roland McGrath <roland@gnu.org> | 2005-10-17 20:59:28 +0000 |
commit | a3fcd5e8a45072b7450df091f0252ba3da242dd6 (patch) | |
tree | 7a5792613c3fda43f4fb6269771c94e146404fae /elf | |
parent | 4fa64d66fef11970e4b57b5a60e8d23144c4b899 (diff) | |
download | glibc-a3fcd5e8a45072b7450df091f0252ba3da242dd6.zip glibc-a3fcd5e8a45072b7450df091f0252ba3da242dd6.tar.gz glibc-a3fcd5e8a45072b7450df091f0252ba3da242dd6.tar.bz2 |
2005-10-17 Roland McGrath <roland@redhat.com>
* elf/dl-load.c (MAP_COPY): When undefined, define to
MAP_PRIVATE|MAP_DENYWRITE instead of just MAP_PRIVATE.
(_dl_map_object_from_fd): Don't use MAP_DENYWRITE explicitly.
Diffstat (limited to 'elf')
-rw-r--r-- | elf/dl-load.c | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/elf/dl-load.c b/elf/dl-load.c index 0ed670d..bba1c83 100644 --- a/elf/dl-load.c +++ b/elf/dl-load.c @@ -50,15 +50,17 @@ overwritten. Some losing VM systems like Linux's lack MAP_COPY. All we get is MAP_PRIVATE, which copies each page when it is modified; this means if the file is overwritten, we may at some point get some pages - from the new version after starting with pages from the old version. */ -#ifndef MAP_COPY -# define MAP_COPY MAP_PRIVATE -#endif + from the new version after starting with pages from the old version. -/* We want to prevent people from modifying DSOs which are currently in - use. This is what MAP_DENYWRITE is for. */ -#ifndef MAP_DENYWRITE -# define MAP_DENYWRITE 0 + To make up for the lack and avoid the overwriting problem, + what Linux does have is MAP_DENYWRITE. This prevents anyone + from modifying the file while we have it mapped. */ +#ifndef MAP_COPY +# ifdef MAP_DENYWRITE +# define MAP_COPY (MAP_PRIVATE | MAP_DENYWRITE) +# else +# define MAP_COPY MAP_PRIVATE +# endif #endif /* Some systems link their relocatable objects for another base address @@ -1181,7 +1183,7 @@ cannot allocate TLS data structures for initial thread"); /* Remember which part of the address space this object uses. */ l->l_map_start = (ElfW(Addr)) __mmap ((void *) mappref, maplength, c->prot, - MAP_COPY|MAP_FILE|MAP_DENYWRITE, + MAP_COPY|MAP_FILE, fd, c->mapoff); if (__builtin_expect ((void *) l->l_map_start == MAP_FAILED, 0)) { @@ -1229,7 +1231,7 @@ cannot allocate TLS data structures for initial thread"); /* Map the segment contents from the file. */ && (__mmap ((void *) (l->l_addr + c->mapstart), c->mapend - c->mapstart, c->prot, - MAP_FIXED|MAP_COPY|MAP_FILE|MAP_DENYWRITE, + MAP_FIXED|MAP_COPY|MAP_FILE, fd, c->mapoff) == MAP_FAILED)) goto map_error; |