mmap and MAP_STACK

Konstantin Belousov kostikbel at gmail.com
Wed Oct 21 15:28:54 UTC 2020


On Wed, Oct 21, 2020 at 06:18:50PM +0300, Nick Kostirya via freebsd-stable wrote:
> On Wed, 21 Oct 2020 17:16:57 +0300
> Konstantin Belousov <kostikbel at gmail.com> wrote:
> 
> > On Wed, Oct 21, 2020 at 04:53:11PM +0300, Nick Kostirya via freebsd-stable wrote:
> > > Hello.
> > > I have question about mmap.
> > > 
> > > void *OSMem::AllocateDataArea(size_t &space)
> > > {
> > >     // Round up to an integral number of pages.
> > >     space = (space + pageSize-1) & ~(pageSize-1);
> > >     int fd = -1; // This value is required by FreeBSD.  Linux doesn't care
> > >     int flags = MAP_PRIVATE | MAP_ANON;
> > > #ifdef MAP_STACK
> > >     if (memUsage == UsageStack) flags |= MAP_STACK; // OpenBSD seems to require this
> > > #endif
> > >     void *result = mmap(0, space, PROT_READ|PROT_WRITE, flags, fd, 0);
> > >     // Convert MAP_FAILED (-1) into NULL
> > >     if (result == MAP_FAILED)
> > >         return 0;
> > >     return result;
> > > }
> > > 
> > > 
> > > When MAP_STACK is used, "insufficient memory" error occurs.
> > > When MAP_STACK removed, it is all right.
> > > 
> > > Please tell me why.  
> > Show ktrace/kdump output of the mmap(2) without and with MAP_STACK.
> > 
> > Or provide a minimal self-contained C source that demonstrates your
> > issue.
> 
> kdump with MAP_STACK.
> 
>  87183 polyimport CALL  mmap(0,0x1000,0x3<PROT_READ|PROT_WRITE>,0x1402<MAP_PRIVATE|MAP_STACK|MAP_ANON>,0xffffffff,0,0)
>  87183 polyimport RET   mmap -1 errno 22 Invalid argument
So it is anything but 'insufficient memory' (I suspected ENOMEM).
EINVAL there is because sysctl security.bsd.stack_guard_page default value
is 1, which means that at least one page of the stack is reserved as guard.
Kernel does not allow to map stack that would have no data pages (all pages
are guard).

Your mapping request is for one page, and one page is due to guard, so
you get EINVAL.  Generally MAP_STACK is magic and requires caller to know
what it does.

> 
> 
> kdump without MAP_STACK.
> 
>  93712 polyimport CALL  mmap(0,0x1000,0x3<PROT_READ|PROT_WRITE>,0x1002<MAP_PRIVATE|MAP_ANON>,0xffffffff,0,0)
>  93712 polyimport RET   mmap 547053568/0x209b6000
> 
> 
> 
> _______________________________________________
> freebsd-stable at freebsd.org mailing list
> https://lists.freebsd.org/mailman/listinfo/freebsd-stable
> To unsubscribe, send any mail to "freebsd-stable-unsubscribe at freebsd.org"


More information about the freebsd-stable mailing list