This is the mail archive of the cygwin-developers mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Broken autoconf mmap test


On Mar 25 10:34, Corinna Vinschen wrote:
> If you guys think that cheating for autoconf on 64 bit systems is a good
> idea, I'm willing to implement it.

Here's a patch which works fine for me:

Index: mmap.cc
===================================================================
RCS file: /cvs/src/src/winsup/cygwin/mmap.cc,v
retrieving revision 1.166
diff -u -p -r1.166 mmap.cc
--- mmap.cc	18 Mar 2011 13:56:56 -0000	1.166
+++ mmap.cc	25 Mar 2011 10:17:09 -0000
@@ -801,6 +801,38 @@ mmap64 (void *addr, size_t len, int prot
       /* mmap /dev/zero is like MAP_ANONYMOUS. */
       if (fh->get_device () == FH_ZERO)
 	flags |= MAP_ANONYMOUS;
+
+      /* The autoconf mmap test maps a file of size 1 byte.  It then tests
+	 every byte of the entire mapped page of 64K for 0-bytes since that's
+	 what POSIX requires.  The problem is, we can't create that mapping on
+	 64 bit systems.  The file mapping will be only a single page, 4K, and
+	 since 64 bit systems don't support the AT_ROUND_TO_PAGE flag, the
+	 remainder of the 64K slot will result in a SEGV when accessed.
+
+	 So, what we do here is cheating for autoconf.  We know exactly what
+	 autoconf is doing.  The file is called conftest.txt, it has a size of
+	 1 byte, the requested mapping size is 64K, the requested protection
+	 is PROT_READ | PROT_WRITE, the mapping is MAP_SHARED, the offset is 0.
+
+	 If all these requirements are given, we just return an anonymous map
+	 of 64K.  This will help to get over the autoconf test even on 64 bit
+	 systems. */
+      if (wincap.is_wow64 ())
+	{
+	  UNICODE_STRING fname;
+	  unsigned long long fsize = fh->pc.fs_is_nfs ()
+				     ? fh->pc.nfsattr ()->size
+				     : fh->pc.fnoi ()->EndOfFile.QuadPart;
+
+	  RtlSplitUnicodePath (fh->pc.get_nt_native_path (), NULL, &fname);
+	  if (wcscmp (fname.Buffer, L"conftest.txt") == 0
+	      && fsize == 1LL
+	      && len == pagesize
+	      && prot == (PROT_READ | PROT_WRITE)
+	      && flags == MAP_SHARED
+	      && off == 0)
+	    flags |= MAP_ANONYMOUS;
+	}
     }
 
   if (anonymous (flags) || fd == -1)


Corinna

-- 
Corinna Vinschen                  Please, send mails regarding Cygwin to
Cygwin Project Co-Leader          cygwin AT cygwin DOT com
Red Hat


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]