diff options
author | Pino Toscano <toscano.pino@tiscali.it> | 2011-11-06 12:39:04 +0100 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2011-11-06 13:12:14 +0100 |
commit | 56e25a91e9e25eba8da099efa89c3c487c3490cf (patch) | |
tree | e9eef9929fbca4947557a015fcbf571592adefba | |
parent | ea6390b2f20a03b7d504bc68a1c95e645d271149 (diff) |
pthread_getspecific, pthread_setspecific: check the key validity
When getting a TSD, handle gracefully the case of an invalid key.
When setting a TSD, check for the validity of the key as recommended
(although not required) by POSIX. This also avoids potentially
filling the `thread_specifics' hash of threads with TSD of invalid
keys.
Add two simple checks in test-7.c for the two situations above.
* sysdeps/hurd/pt-getspecific.c (pthread_getspecific): Check the
validity of the specified key.
* sysdeps/hurd/pt-setspecific.c (pthread_setspecific): Likewise.
* tests/test-7.c (main): Add two assertions.
-rw-r--r-- | sysdeps/hurd/pt-getspecific.c | 4 | ||||
-rw-r--r-- | sysdeps/hurd/pt-setspecific.c | 4 | ||||
-rw-r--r-- | tests/test-7.c | 3 |
3 files changed, 10 insertions, 1 deletions
diff --git a/sysdeps/hurd/pt-getspecific.c b/sysdeps/hurd/pt-getspecific.c index 3060598..71ec63c 100644 --- a/sysdeps/hurd/pt-getspecific.c +++ b/sysdeps/hurd/pt-getspecific.c @@ -27,7 +27,9 @@ pthread_getspecific (pthread_key_t key) { struct __pthread *self; - assert (key < __pthread_key_count); + if (key < 0 || key >= __pthread_key_count + || __pthread_key_destructors[key] == PTHREAD_KEY_INVALID) + return NULL; self = _pthread_self (); if (! self->thread_specifics) diff --git a/sysdeps/hurd/pt-setspecific.c b/sysdeps/hurd/pt-setspecific.c index 89ca4d7..d0b7302 100644 --- a/sysdeps/hurd/pt-setspecific.c +++ b/sysdeps/hurd/pt-setspecific.c @@ -28,6 +28,10 @@ pthread_setspecific (pthread_key_t key, const void *value) error_t err; struct __pthread *self = _pthread_self (); + if (key < 0 || key >= __pthread_key_count + || __pthread_key_destructors[key] == PTHREAD_KEY_INVALID) + return EINVAL; + if (! self->thread_specifics) { err = hurd_ihash_create (&self->thread_specifics, HURD_IHASH_NO_LOCP); diff --git a/tests/test-7.c b/tests/test-7.c index 8159be3..22fb1ca 100644 --- a/tests/test-7.c +++ b/tests/test-7.c @@ -42,6 +42,9 @@ main (int argc, char **argv) assert ((pthread_t) val == pthread_self ()); } + assert (pthread_getspecific ((pthread_key_t) 0) == NULL); + assert (pthread_setspecific ((pthread_key_t) 0, (void *) 0x1) == EINVAL); + for (i = 0; i < KEYS; i ++) err = pthread_key_create (&key[i], des); |