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.jun...@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 */
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to