]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
nptl: Change type of __default_pthread_attr
authorFlorian Weimer <fweimer@redhat.com>
Mon, 18 May 2020 16:25:18 +0000 (18:25 +0200)
committerFlorian Weimer <fweimer@redhat.com>
Tue, 2 Jun 2020 08:32:37 +0000 (10:32 +0200)
union pthread_attr_transparent has always the correct size, even if
pthread_attr_t has padding that is not present in struct pthread_attr.

This should not result in an observable behavioral change.  The
existing code appears to have been correct, but it was brittle because
it was not clear which functions were allowed to write to an entire
pthread_attr_t argument (e.g., by copying it).

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
nptl/allocatestack.c
nptl/nptl-init.c
nptl/pthreadP.h
nptl/pthread_attr_getstacksize.c
nptl/pthread_create.c
nptl/pthread_getattr_default_np.c
nptl/pthread_setattr_default_np.c
nptl/vars.c

index c94980c21c8a0fc437ae94cacd8c293525d240a3..d16f3d71f81f8224211ec61d4acef239873b447d 100644 (file)
@@ -425,7 +425,7 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp,
   else
     {
       lll_lock (__default_pthread_attr_lock, LLL_PRIVATE);
-      size = __default_pthread_attr.stacksize;
+      size = __default_pthread_attr.internal.stacksize;
       lll_unlock (__default_pthread_attr_lock, LLL_PRIVATE);
     }
 
index 96b1444a01bf16e5fae7e43453b51dd1f8e44516..d4cf20e3d1b09f10ba31670f7315843aa3e5bdcf 100644 (file)
@@ -318,8 +318,8 @@ __pthread_initialize_minimal_internal (void)
   /* Round the resource limit up to page size.  */
   limit.rlim_cur = ALIGN_UP (limit.rlim_cur, pagesz);
   lll_lock (__default_pthread_attr_lock, LLL_PRIVATE);
-  __default_pthread_attr.stacksize = limit.rlim_cur;
-  __default_pthread_attr.guardsize = GLRO (dl_pagesize);
+  __default_pthread_attr.internal.stacksize = limit.rlim_cur;
+  __default_pthread_attr.internal.guardsize = GLRO (dl_pagesize);
   lll_unlock (__default_pthread_attr_lock, LLL_PRIVATE);
 
 #ifdef SHARED
index 9c6dd41b7c2b655387b751233ec5f25e25ce1f30..acc8e88e4a21876f304811492e5dcf26ee44dcec 100644 (file)
@@ -199,7 +199,7 @@ enum
 
 
 /* Default pthread attributes.  */
-extern struct pthread_attr __default_pthread_attr attribute_hidden;
+extern union pthread_attr_transparent __default_pthread_attr attribute_hidden;
 extern int __default_pthread_attr_lock attribute_hidden;
 
 /* Size and alignment of static TLS block.  */
index 346b375690d9aef0ff39e3a1a905f3b96731ee41..9830a635a6a6873a744ca8f36eec8fcd6ef9235c 100644 (file)
@@ -33,7 +33,7 @@ __pthread_attr_getstacksize (const pthread_attr_t *attr, size_t *stacksize)
   if (size == 0)
     {
       lll_lock (__default_pthread_attr_lock, LLL_PRIVATE);
-      size = __default_pthread_attr.stacksize;
+      size = __default_pthread_attr.internal.stacksize;
       lll_unlock (__default_pthread_attr_lock, LLL_PRIVATE);
     }
   *stacksize = size;
index 347d51070740d9fd645de9d9b133774db0406d5a..86fbeb52184939b78471f6badee16e179592dc16 100644 (file)
@@ -612,16 +612,16 @@ __pthread_create_2_1 (pthread_t *newthread, const pthread_attr_t *attr,
   STACK_VARIABLES;
 
   const struct pthread_attr *iattr = (struct pthread_attr *) attr;
-  struct pthread_attr default_attr;
+  union pthread_attr_transparent default_attr;
   bool destroy_default_attr = false;
   bool c11 = (attr == ATTR_C11_THREAD);
   if (iattr == NULL || c11)
     {
-      int ret = __pthread_getattr_default_np ((pthread_attr_t *) &default_attr);
+      int ret = __pthread_getattr_default_np (&default_attr.external);
       if (ret != 0)
        return ret;
       destroy_default_attr = true;
-      iattr = &default_attr;
+      iattr = &default_attr.internal;
     }
 
   struct pthread *pd = NULL;
@@ -852,7 +852,7 @@ __pthread_create_2_1 (pthread_t *newthread, const pthread_attr_t *attr,
 
  out:
   if (destroy_default_attr)
-    __pthread_attr_destroy ((pthread_attr_t *) &default_attr);
+    __pthread_attr_destroy (&default_attr.external);
 
   return retval;
 }
index 5c99f980e2153b5d4d1ed5f3fb8413d662f05f34..f3ce1c2885a8b73bb7b34225d912bd6b045f07fd 100644 (file)
@@ -22,8 +22,7 @@ int
 __pthread_getattr_default_np (pthread_attr_t *out)
 {
   lll_lock (__default_pthread_attr_lock, LLL_PRIVATE);
-  int ret = __pthread_attr_copy (out,
-                                 (pthread_attr_t *) &__default_pthread_attr);
+  int ret = __pthread_attr_copy (out, &__default_pthread_attr.external);
   lll_unlock (__default_pthread_attr_lock, LLL_PRIVATE);
   return ret;
 }
index eb5d24d3bde9abc6c30270e4d341405314434608..c4cfb4e8efaf222a4fc0ef6b21065b69958dd4b5 100644 (file)
@@ -68,15 +68,15 @@ pthread_setattr_default_np (const pthread_attr_t *in)
 
   /* Preserve the previous stack size (see above).  */
   if (temp.internal.stacksize == 0)
-    temp.internal.stacksize = __default_pthread_attr.stacksize;
+    temp.internal.stacksize = __default_pthread_attr.internal.stacksize;
 
   /* Destroy the old attribute structure because it will be
      overwritten.  */
-  __pthread_attr_destroy ((pthread_attr_t *) &__default_pthread_attr);
+  __pthread_attr_destroy (&__default_pthread_attr.external);
 
   /* __default_pthread_attr takes ownership, so do not free
      attrs.internal after this point.  */
-  __default_pthread_attr = temp.internal;
+  __default_pthread_attr = temp;
 
   lll_unlock (__default_pthread_attr_lock, LLL_PRIVATE);
   return ret;
index b88300d9b482846674412b5f4916d5c94ab91937..36960201450962b99c54bd86c4fe3b466133d677 100644 (file)
@@ -22,7 +22,7 @@
 
 /* Default thread attributes for the case when the user does not
    provide any.  */
-struct pthread_attr __default_pthread_attr attribute_hidden;
+union pthread_attr_transparent __default_pthread_attr attribute_hidden;
 
 /* Mutex protecting __default_pthread_attr.  */
 int __default_pthread_attr_lock = LLL_LOCK_INITIALIZER;