you should only do that if key is valid, not always. also
specific_data might be NULL.
i don't think this is correct.

On Sat, Jul 2, 2011 at 4:53 PM, Mike Belopuhov <[email protected]> wrote:
> On Sat, Jul 02, 2011 at 11:04 -0400, Ted Unangst wrote:
>> On Mon, Jun 27, 2011, Henry Precheur wrote:
>> > According to pthread_key_create(3): Upon key creation, the value NULL is
>> > associated with the new key in all active threads.
>> >
>> >
>> > When pthread_key_create reuse an existing key, the old value is still
>> > here, which can create problems. The following program reproduces the
>> > problem:
>>
>> Good catch.  Here's a fix.
>>
>
> OK mikeb
>
>> Index: uthread/uthread_spec.c
>> ===================================================================
>> RCS file: /home/tedu/cvs/src/lib/libpthread/uthread/uthread_spec.c,v
>> retrieving revision 1.9
>> diff -u -r1.9 uthread_spec.c
>> --- uthread/uthread_spec.c    20 Jul 2007 22:34:40 -0000      1.9
>> +++ uthread/uthread_spec.c    2 Jul 2011 14:57:41 -0000
>> @@ -78,6 +78,7 @@
>>  pthread_key_delete(pthread_key_t key)
>>  {
>>       int ret = 0;
>> +     pthread_t pthread;
>>
>>       if (key < PTHREAD_KEYS_MAX) {
>>               /* Lock the key table entry: */
>> @@ -88,8 +89,19 @@
>>               else
>>                       ret = EINVAL;
>>
>> +             _thread_kern_sig_defer();
>> +             TAILQ_FOREACH(pthread, &_thread_list, tle) {
>> +                     if (pthread->specific_data[key]) {
>> +                             pthread->specific_data[key] = NULL;
>> +                             pthread->specific_data_count--;
>> +                     }
>> +
>> +             }
>> +             _thread_kern_sig_undefer();
>> +
>>               /* Unlock the key table entry: */
>>               _SPINUNLOCK(&key_table[key].lock);
>> +
>>       } else
>>               ret = EINVAL;
>>       return (ret);

Reply via email to