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.26.9000-1097-g630f4cc


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  630f4cc3aa019ede55976ea561f1a7af2f068639 (commit)
      from  c70e4e9c9efff9df4c847dd7cfd81bae674219ab (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=630f4cc3aa019ede55976ea561f1a7af2f068639

commit 630f4cc3aa019ede55976ea561f1a7af2f068639
Author: Szabolcs Nagy <szabolcs.nagy@arm.com>
Date:   Wed Dec 6 13:05:50 2017 +0000

    [BZ #22637] Fix stack guard size accounting
    
    Previously if user requested S stack and G guard when creating a
    thread, the total mapping was S and the actual available stack was
    S - G - static_tls, which is not what the user requested.
    
    This patch fixes the guard size accounting by pretending the user
    requested S+G stack.  This way all later logic works out except
    when reporting the user requested stack size (pthread_getattr_np)
    or when computing the minimal stack size (__pthread_get_minstack).
    
    Normally this will increase thread stack allocations by one page.
    TLS accounting is not affected, that will require a separate fix.
    
    	[BZ #22637]
    	* nptl/descr.h (stackblock, stackblock_size): Update comments.
    	* nptl/allocatestack.c (allocate_stack): Add guardsize to stacksize.
    	* nptl/nptl-init.c (__pthread_get_minstack): Remove guardsize from
    	stacksize.
    	* nptl/pthread_getattr_np.c (pthread_getattr_np): Likewise.

diff --git a/ChangeLog b/ChangeLog
index ad0641e..8824881 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2018-01-08  Szabolcs Nagy  <szabolcs.nagy@arm.com>
+
+	[BZ #22637]
+	* nptl/descr.h (stackblock, stackblock_size): Update comments.
+	* nptl/allocatestack.c (allocate_stack): Add guardsize to stacksize.
+	* nptl/nptl-init.c (__pthread_get_minstack): Remove guardsize from
+	stacksize.
+	* nptl/pthread_getattr_np.c (pthread_getattr_np): Likewise.
+
 2018-01-08  H.J. Lu  <hongjiu.lu@intel.com>
 
 	* sysdeps/x86_64/fpu/multiarch/Makefile (libm-sysdep_routines):
diff --git a/nptl/allocatestack.c b/nptl/allocatestack.c
index 05b8ed3..b374f47 100644
--- a/nptl/allocatestack.c
+++ b/nptl/allocatestack.c
@@ -532,6 +532,10 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp,
       /* Make sure the size of the stack is enough for the guard and
 	 eventually the thread descriptor.  */
       guardsize = (attr->guardsize + pagesize_m1) & ~pagesize_m1;
+      if (guardsize < attr->guardsize || size + guardsize < guardsize)
+	/* Arithmetic overflow.  */
+	return EINVAL;
+      size += guardsize;
       if (__builtin_expect (size < ((guardsize + __static_tls_size
 				     + MINIMAL_REST_STACK + pagesize_m1)
 				    & ~pagesize_m1),
diff --git a/nptl/descr.h b/nptl/descr.h
index da9c567..1cc6b09 100644
--- a/nptl/descr.h
+++ b/nptl/descr.h
@@ -383,9 +383,9 @@ struct pthread
   /* Machine-specific unwind info.  */
   struct _Unwind_Exception exc;
 
-  /* If nonzero pointer to area allocated for the stack and its
-     size.  */
+  /* If nonzero, pointer to the area allocated for the stack and guard. */
   void *stackblock;
+  /* Size of the stackblock area including the guard.  */
   size_t stackblock_size;
   /* Size of the included guard area.  */
   size_t guardsize;
diff --git a/nptl/nptl-init.c b/nptl/nptl-init.c
index c237a36..5a4b524 100644
--- a/nptl/nptl-init.c
+++ b/nptl/nptl-init.c
@@ -472,8 +472,5 @@ strong_alias (__pthread_initialize_minimal_internal,
 size_t
 __pthread_get_minstack (const pthread_attr_t *attr)
 {
-  struct pthread_attr *iattr = (struct pthread_attr *) attr;
-
-  return (GLRO(dl_pagesize) + __static_tls_size + PTHREAD_STACK_MIN
-	  + iattr->guardsize);
+  return GLRO(dl_pagesize) + __static_tls_size + PTHREAD_STACK_MIN;
 }
diff --git a/nptl/pthread_getattr_np.c b/nptl/pthread_getattr_np.c
index 961d711..ae12592 100644
--- a/nptl/pthread_getattr_np.c
+++ b/nptl/pthread_getattr_np.c
@@ -57,9 +57,12 @@ pthread_getattr_np (pthread_t thread_id, pthread_attr_t *attr)
   /* The sizes are subject to alignment.  */
   if (__glibc_likely (thread->stackblock != NULL))
     {
-      iattr->stacksize = thread->stackblock_size;
+      /* The stack size reported to the user should not include the
+	 guard size.  */
+      iattr->stacksize = thread->stackblock_size - thread->guardsize;
 #if _STACK_GROWS_DOWN
-      iattr->stackaddr = (char *) thread->stackblock + iattr->stacksize;
+      iattr->stackaddr = (char *) thread->stackblock
+			 + thread->stackblock_size;
 #else
       iattr->stackaddr = (char *) thread->stackblock;
 #endif

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

Summary of changes:
 ChangeLog                 |    9 +++++++++
 nptl/allocatestack.c      |    4 ++++
 nptl/descr.h              |    4 ++--
 nptl/nptl-init.c          |    5 +----
 nptl/pthread_getattr_np.c |    7 +++++--
 5 files changed, 21 insertions(+), 8 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]