This is the mail archive of the glibc-cvs@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

GNU C Library master sources branch master updated. glibc-2.25-167-g21f042c


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".

The branch, master has been updated
       via  21f042c804835d1f7a4a8e06f2c93ca35a182042 (commit)
      from  622222846a2e6ffbcd02cb46cb5f29c48fe4a466 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=21f042c804835d1f7a4a8e06f2c93ca35a182042

commit 21f042c804835d1f7a4a8e06f2c93ca35a182042
Author: Mike Frysinger <vapier@gentoo.org>
Date:   Wed Mar 15 23:59:31 2017 -0700

    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

diff --git a/ChangeLog b/ChangeLog
index 0c95ed9..2ca0348 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2017-04-03  Mike Frysinger  <vapier@gentoo.org>
+
+	[BZ #21253]
+	* sysdeps/unix/sysv/linux/spawni.c (__spawnix): Increase argv_size
+	slack space by 32KiB.
+
 2017-04-01  Wladimir van der Laan  <laanwj@gmail.com>
 
 	[BZ# 21338]
diff --git a/sysdeps/unix/sysv/linux/spawni.c b/sysdeps/unix/sysv/linux/spawni.c
index b82a5e8..d7f9e83 100644
--- a/sysdeps/unix/sysv/linux/spawni.c
+++ b/sysdeps/unix/sysv/linux/spawni.c
@@ -319,6 +319,11 @@ __spawnix (pid_t * pid, const char *file,
 
   /* Add a slack area for child's stack.  */
   size_t argv_size = (argc * sizeof (void *)) + 512;
+  /* We need at least a few pages in case the compiler's stack checking is
+     enabled.  In some configs, it is known to use at least 24KiB.  We use
+     32KiB to be "safe" from anything the compiler might do.  Besides, the
+     extra pages won't actually be allocated unless they get used.  */
+  argv_size += (32 * 1024);
   size_t stack_size = ALIGN_UP (argv_size, GLRO(dl_pagesize));
   void *stack = __mmap (NULL, stack_size, prot,
 			MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK, -1, 0);

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog                        |    6 ++++++
 sysdeps/unix/sysv/linux/spawni.c |    5 +++++
 2 files changed, 11 insertions(+), 0 deletions(-)


hooks/post-receive
-- 
GNU C Library master sources


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]