svn commit: r355657 - head/libexec/rtld-elf
Brandon Bergren
bdragon at FreeBSD.org
Thu Dec 12 17:40:33 UTC 2019
Author: bdragon
Date: Thu Dec 12 17:40:32 2019
New Revision: 355657
URL: https://svnweb.freebsd.org/changeset/base/355657
Log:
rtld: do not try to mmap a zero-sized PT_LOAD
When a PT_LOAD segment has a zero p_filesz, skip the data mmap, as mmapping
zero bytes from a file is an error.
A PT_LOAD with zero p_filesz is legal (but somewhat uncommon due to segment
merging in modern linkers, as it is more efficient to merge .data and .bss
by just extending p_memsz in the previous segment, assuming compatible
page protection.)
This was seen on ports/graphics/glew on a powerpc64 ELFv2 experimental
build.
Submitted by: Alfredo Dal'Ava Junior <alfredo.junior at eldorado.org.br>
Reviewed by: kib
Differential Revision: https://reviews.freebsd.org/D22634
Modified:
head/libexec/rtld-elf/map_object.c
Modified: head/libexec/rtld-elf/map_object.c
==============================================================================
--- head/libexec/rtld-elf/map_object.c Thu Dec 12 17:12:18 2019 (r355656)
+++ head/libexec/rtld-elf/map_object.c Thu Dec 12 17:40:32 2019 (r355657)
@@ -228,11 +228,12 @@ map_object(int fd, const char *path, const struct stat
data_addr = mapbase + (data_vaddr - base_vaddr);
data_prot = convert_prot(segs[i]->p_flags);
data_flags = convert_flags(segs[i]->p_flags) | MAP_FIXED;
- if (mmap(data_addr, data_vlimit - data_vaddr, data_prot,
- data_flags | MAP_PREFAULT_READ, fd, data_offset) == (caddr_t) -1) {
- _rtld_error("%s: mmap of data failed: %s", path,
- rtld_strerror(errno));
- goto error1;
+ if (data_vlimit != data_vaddr &&
+ mmap(data_addr, data_vlimit - data_vaddr, data_prot,
+ data_flags | MAP_PREFAULT_READ, fd, data_offset) == MAP_FAILED) {
+ _rtld_error("%s: mmap of data failed: %s", path,
+ rtld_strerror(errno));
+ goto error1;
}
/* Do BSS setup */
More information about the svn-src-all
mailing list