svn commit: r315556 - stable/11/sys/compat/linux
Edward Tomasz Napierala
trasz at FreeBSD.org
Sun Mar 19 15:32:13 UTC 2017
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);
More information about the svn-src-stable
mailing list