make new TLS setup block even implementation-internals signals
authorRich Felker <dalias@aerifal.cx>
Sun, 7 Oct 2012 03:57:51 +0000 (23:57 -0400)
committerRich Felker <dalias@aerifal.cx>
Sun, 7 Oct 2012 03:57:51 +0000 (23:57 -0400)
this is needed to ensure async-cancel-safety, i.e. to make it safe to
access TLS objects when async cancellation is enabled. otherwise, if
cancellation were acter upon after the atomic fetch/add but before the
thread saved the obtained memory, another access to the same TLS in
the cancellation handler could end up performing the atomic fetch/add
again, consuming more memory than is actually available and
overflowing into other objects on the heap.

src/ldso/dynlink.c

index e944c8e..93cfb42 100644 (file)
@@ -730,8 +730,7 @@ void *__tls_get_addr(size_t *v)
 
        /* Block signals to make accessing new TLS async-signal-safe */
        sigset_t set;
-       sigfillset(&set);
-       pthread_sigmask(SIG_BLOCK, &set, &set);
+       pthread_sigmask(SIG_BLOCK, SIGALL_SET, &set);
        if (self->dtv && v[0]<=(size_t)self->dtv[0] && self->dtv[v[0]]) {
                pthread_sigmask(SIG_SETMASK, &set, 0);
                return (char *)self->dtv[v[0]]+v[1];