about summary refs log tree commit diff
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2015-02-07 22:22:40 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2015-02-07 22:22:40 +0100
commite86c5b6459e9803118cd4708e0ff024a27bf33f8 (patch)
tree641364f58d588e02341e9b772a02c1c113afac0e
parentc187253fc222ed05de710d94b5bcaf02c3ef37c5 (diff)
downloadglibc-e86c5b6459e9803118cd4708e0ff024a27bf33f8.tar.gz
glibc-e86c5b6459e9803118cd4708e0ff024a27bf33f8.tar.xz
glibc-e86c5b6459e9803118cd4708e0ff024a27bf33f8.zip
hurd: support mmap with PROT_NONE
-rw-r--r--ChangeLog1
-rw-r--r--sysdeps/mach/hurd/mmap.c11
2 files changed, 10 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 4ba04cdd86..3c19596338 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,6 +2,7 @@
 
 	* hurd/hurd/signal.h (_hurd_critical_section_lock): Don't unlock
 	sigstate.
+	* sysdeps/mach/hurd/mmap.c (__mmap): Also handle PROT_NONE case.
 
 2015-02-07  Samuel Thibault  <samuel.thibault@ens-lyon.org>
 
diff --git a/sysdeps/mach/hurd/mmap.c b/sysdeps/mach/hurd/mmap.c
index ca34045012..393008f2fe 100644
--- a/sysdeps/mach/hurd/mmap.c
+++ b/sysdeps/mach/hurd/mmap.c
@@ -97,6 +97,13 @@ __mmap (__ptr_t addr, size_t len, int prot, int flags, int fd, off_t offset)
 	  }
 	switch (prot & (PROT_READ|PROT_WRITE))
 	  {
+	  /* Although it apparently doesn't make sense to map a file with
+	     protection set to PROT_NONE, it is actually sometimes done.
+	     In particular, that's how localedef reserves some space for
+	     the locale archive file, the rationale being that some
+	     implementations take into account whether the mapping is
+	     anonymous or not when selecting addresses.  */
+	  case PROT_NONE:
 	  case PROT_READ:
 	    memobj = robj;
 	    if (wobj != MACH_PORT_NULL)
@@ -126,8 +133,8 @@ __mmap (__ptr_t addr, size_t len, int prot, int flags, int fd, off_t offset)
 		return (__ptr_t) (long int) __hurd_fail (EACCES);
 	      }
 	    break;
-	  default:		/* impossible */
-	    return 0;
+	  default:
+	    __builtin_unreachable ();
 	  }
 	break;
 	/* XXX handle MAP_NOEXTEND */