diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2022-02-14 00:15:13 +0100 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2022-02-14 19:29:02 +0100 |
commit | 315c9e794a5fb8f9672081dbd7493b5fd036ab05 (patch) | |
tree | fbcefd907c86a793e7668c6581c370a8502efc03 | |
parent | 0fb8800029d230b3711bf722b2a47db92d0e273f (diff) | |
download | glibc-315c9e794a5fb8f9672081dbd7493b5fd036ab05.tar.gz glibc-315c9e794a5fb8f9672081dbd7493b5fd036ab05.tar.xz glibc-315c9e794a5fb8f9672081dbd7493b5fd036ab05.zip |
htl: Make pthread_[gs]etspecific not check for key validity
Since __pthread_key_create might be concurrently reallocating the __pthread_key_destructors array, it's not safe to access it without the mutex held. Posix explicitly says we are allowed to prefer performance over error detection.
-rw-r--r-- | sysdeps/htl/pt-getspecific.c | 3 | ||||
-rw-r--r-- | sysdeps/htl/pt-setspecific.c | 3 |
2 files changed, 2 insertions, 4 deletions
diff --git a/sysdeps/htl/pt-getspecific.c b/sysdeps/htl/pt-getspecific.c index af1161206a..a9dfd8a775 100644 --- a/sysdeps/htl/pt-getspecific.c +++ b/sysdeps/htl/pt-getspecific.c @@ -25,8 +25,7 @@ __pthread_getspecific (pthread_key_t key) { struct __pthread *self; - if (key < 0 || key >= __pthread_key_count - || __pthread_key_destructors[key] == PTHREAD_KEY_INVALID) + if (key < 0 || key >= __pthread_key_count) return NULL; self = _pthread_self (); diff --git a/sysdeps/htl/pt-setspecific.c b/sysdeps/htl/pt-setspecific.c index 982d25d012..d201416d5d 100644 --- a/sysdeps/htl/pt-setspecific.c +++ b/sysdeps/htl/pt-setspecific.c @@ -25,8 +25,7 @@ __pthread_setspecific (pthread_key_t key, const void *value) { struct __pthread *self = _pthread_self (); - if (key < 0 || key >= __pthread_key_count - || __pthread_key_destructors[key] == PTHREAD_KEY_INVALID) + if (key < 0 || key >= __pthread_key_count) return EINVAL; if (key >= self->thread_specifics_size) |