On Sun, Jul 30, 2023 at 01:30:37PM +0300, Dmitry Chagin wrote:
> On Wed, Jul 26, 2023 at 05:25:37AM +0000, Alan Cox wrote:
> > The branch main has been updated by alc:
> > 
> > URL: 
> > https://cgit.FreeBSD.org/src/commit/?id=50d663b14b310d6020b4b6cc92d4fae985f086f2
> > 
> > commit 50d663b14b310d6020b4b6cc92d4fae985f086f2
> > Author:     Alan Cox <[email protected]>
> > AuthorDate: 2023-07-25 07:24:19 +0000
> > Commit:     Alan Cox <[email protected]>
> > CommitDate: 2023-07-26 05:24:50 +0000
> > 
> >     vm: Fix vm_map_find_min()
> >     
> >     Fix the handling of address hints that are less than min_addr by
> >     vm_map_find_min().
> >     
> Thank you for fixing that, however it still fails under Linuxulator.
> 
> 
> #include <sys/mman.h>
> #include <sys/stat.h>
> 
> #include <assert.h>
> #include <fcntl.h>
> #include <stdint.h>
> #include <stdio.h>
> #include <stdlib.h>
> #include <unistd.h>
> 
> int
> main(int argc, char** argv)
> {
>       struct stat sb;
>       void *s32;
>       int f, r;
> 
>       f = open(argv[0], O_RDONLY);
>       assert(f > 0);
> 
>       r = fstat(f, &sb);
>       assert(r == 0);
> 
>       s32  = mmap(NULL, sb.st_size, PROT_READ,
>           MAP_32BIT|MAP_PRIVATE, f, 0);
>       assert(s32 != MAP_FAILED);
>       assert((uintptr_t)s32 < 0x80000000);
> 
>       close(f);
>       munmap(s32, sb.st_size);
>       return (0);
> }
> 

hmm, it also fails natively with disable aslr


> 
> 
> >     Reported by:    dchagin
> >     Reviewed by:    kib
> >     Fixes:  d8e6f4946cec0 "vm: Fix anonymous memory clustering under ASLR"
> >     Differential Revision:  https://reviews.freebsd.org/D41159
> > ---
> >  sys/vm/vm_map.c | 4 ++--
> >  1 file changed, 2 insertions(+), 2 deletions(-)
> > 
> > diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c
> > index 444e09986d4e..eb607d519247 100644
> > --- a/sys/vm/vm_map.c
> > +++ b/sys/vm/vm_map.c
> > @@ -2255,10 +2255,10 @@ vm_map_find_min(vm_map_t map, vm_object_t object, 
> > vm_ooffset_t offset,
> >     int rv;
> >  
> >     hint = *addr;
> > -   if (hint == 0)
> > +   if (hint == 0) {
> >             cow |= MAP_NO_HINT;
> > -   if (hint < min_addr)
> >             *addr = hint = min_addr;
> > +   }
> >     for (;;) {
> >             rv = vm_map_find(map, object, offset, addr, length, max_addr,
> >                 find_space, prot, max, cow);

Reply via email to