Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 12 Dec 2019 17:40:33 +0000 (UTC)
From:      Brandon Bergren <bdragon@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r355657 - head/libexec/rtld-elf
Message-ID:  <201912121740.xBCHeXsg034850@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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@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 */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201912121740.xBCHeXsg034850>