Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 19 Mar 2017 15:32:12 +0000 (UTC)
From:      Edward Tomasz Napierala <trasz@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org
Subject:   svn commit: r315556 - stable/11/sys/compat/linux
Message-ID:  <201703191532.v2JFWCpH093003@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: trasz
Date: Sun Mar 19 15:32:12 2017
New Revision: 315556
URL: https://svnweb.freebsd.org/changeset/base/315556

Log:
  MFC r313947:
  
  There are some Linux binaries that expect the system to obey the "addr"
  parameter to mmap(2), even if MAP_FIXED is not explicitly specified.
  Android ART is one example.  Implement bug compatibility for this case
  in linuxulator.
  
  Sponsored by:	DARPA, AFRL

Modified:
  stable/11/sys/compat/linux/linux_mmap.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/compat/linux/linux_mmap.c
==============================================================================
--- stable/11/sys/compat/linux/linux_mmap.c	Sun Mar 19 15:15:34 2017	(r315555)
+++ stable/11/sys/compat/linux/linux_mmap.c	Sun Mar 19 15:32:12 2017	(r315556)
@@ -203,8 +203,23 @@ linux_mmap_common(struct thread *td, uin
 		}
 	}
 
-	error = kern_mmap(td, addr, len, prot, bsd_flags, fd, pos);
+	/*
+	 * FreeBSD is free to ignore the address hint if MAP_FIXED wasn't
+	 * passed.  However, some Linux applications, like the ART runtime,
+	 * depend on the hint.  If the MAP_FIXED wasn't passed, but the
+	 * address is not zero, try with MAP_FIXED and MAP_EXCL first,
+	 * and fall back to the normal behaviour if that fails.
+	 */
+	if (addr != 0 && (bsd_flags & MAP_FIXED) == 0 &&
+	    (bsd_flags & MAP_EXCL) == 0) {
+		error = kern_mmap(td, addr, len, prot,
+		    bsd_flags | MAP_FIXED | MAP_EXCL, fd, pos);
+		if (error == 0)
+			goto out;
+	}
 
+	error = kern_mmap(td, addr, len, prot, bsd_flags, fd, pos);
+out:
 	LINUX_CTR2(mmap2, "return: %d (%p)", error, td->td_retval[0]);
 
 	return (error);



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