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);
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to