make pthread_attr_init honor defaults set by pthread_setattr_default_np
authorRich Felker <dalias@aerifal.cx>
Fri, 27 Jul 2018 16:05:00 +0000 (12:05 -0400)
committerRich Felker <dalias@aerifal.cx>
Fri, 27 Jul 2018 16:05:00 +0000 (12:05 -0400)
this fixes a major gap in the intended functionality of
pthread_setattr_default_np. if application/library code creating a
thread does not pass a null attribute pointer to pthread_create, but
sets up an attribute object to change other properties while leaving
the stack alone, the created thread will get a stack with size
DEFAULT_STACK_SIZE. this makes pthread_setattr_default_np useless for
working around stack overflow issues in such applications, and leaves
a major risk of regression if previously-working code switches from
using a null attribute pointer to an attribute object.

this change aligns the behavior more closely with the glibc
pthread_setattr_default_np functionality too, albeit via a different
mechanism. glibc encodes "default" specially in the attribute object
and reads the actual default at thread creation time. with this
commit, we now copy the current default into the attribute object at
pthread_attr_init time, so that applications that query the properties
of the attribute object will see the right values.

src/thread/default_attr.c [new file with mode: 0644]
src/thread/pthread_attr_init.c
src/thread/pthread_create.c

diff --git a/src/thread/default_attr.c b/src/thread/default_attr.c
new file mode 100644 (file)
index 0000000..46fe98e
--- /dev/null
@@ -0,0 +1,4 @@
+#include "pthread_impl.h"
+
+size_t __default_stacksize = DEFAULT_STACK_SIZE;
+size_t __default_guardsize = DEFAULT_GUARD_SIZE;
index 8f6e337452bc57ab95b00d030a5e7c7a95ac8390..a962b46080608acf8f20288f36ff6bab9537d11a 100644 (file)
@@ -1,9 +1,12 @@
 #include "pthread_impl.h"
 
+extern size_t __default_stacksize;
+extern size_t __default_guardsize;
+
 int pthread_attr_init(pthread_attr_t *a)
 {
        *a = (pthread_attr_t){0};
-       a->_a_stacksize = DEFAULT_STACK_SIZE;
-       a->_a_guardsize = DEFAULT_GUARD_SIZE;
+       a->_a_stacksize = __default_stacksize;
+       a->_a_guardsize = __default_guardsize;
        return 0;
 }
index 2c066cffffe5c222457f456b34da0de36815d5b1..2df2e9f9d63663a8bf1589c0ddace0f7eb04753d 100644 (file)
@@ -165,8 +165,8 @@ static void *dummy_tsd[1] = { 0 };
 weak_alias(dummy_tsd, __pthread_tsd_main);
 
 volatile int __block_new_threads = 0;
-size_t __default_stacksize = DEFAULT_STACK_SIZE;
-size_t __default_guardsize = DEFAULT_GUARD_SIZE;
+extern size_t __default_stacksize;
+extern size_t __default_guardsize;
 
 static FILE *volatile dummy_file = 0;
 weak_alias(dummy_file, __stdin_used);