posix_spawn: use a larger min stack for -fstack-check [BZ #21253]
commit21f042c804835d1f7a4a8e06f2c93ca35a182042
authorMike Frysinger <vapier@gentoo.org>
Thu, 16 Mar 2017 06:59:31 +0000 (15 23:59 -0700)
committerMike Frysinger <vapier@gentoo.org>
Mon, 3 Apr 2017 19:15:41 +0000 (3 15:15 -0400)
tree3ba976f6d9226a0a8ba8e7f2882f56b3c4990b90
parent622222846a2e6ffbcd02cb46cb5f29c48fe4a466
posix_spawn: use a larger min stack for -fstack-check [BZ #21253]

When glibc is built with -fstack-check, trying to use posix_spawn can
lead to segfaults due to gcc internally probing stack memory too far.
The new spawn API will allocate a minimum of 1 page, but the stack
checking logic might probe a couple of pages.  When it tries to walk
them, everything falls apart.

The gcc internal docs [1] state the default interval checking is one
page.  Which means we need two pages (the current one, and the next
probed).  No target currently defines it larger.

Further, it mentions that the default minimum stack size needed to
recover from an overflow is 4/8KiB for sjlj or 8/12KiB for others.
But some Linux targets (like mips and ppc) go up to 16KiB (and some
non-Linux targets go up to 24KiB).

Let's create each child with a minimum of 32KiB slack space to support
them all, and give us future breathing room.

No test is added as existing ones crash.  Even a simple call is
enough to trigger the problem:
char *argv[] = { "/bin/ls", NULL };
posix_spawn(NULL, "/bin/ls", NULL, NULL, argv, NULL);

[1] https://gcc.gnu.org/onlinedocs/gcc-6.3.0/gccint/Stack-Checking.html
ChangeLog
sysdeps/unix/sysv/linux/spawni.c