From: Alexandra Ellwood Date: Sun, 20 Mar 2005 15:20:38 +0000 (+0000) Subject: threads.c (thread_termination): Free array of pointers to thread-specific data (t... X-Git-Tag: ms-bug-test-20060525~310 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=2db4fa493a20807bab22bbd77708ef72daaba65a;p=krb5.git threads.c (thread_termination): Free array of pointers to thread-specific data (t) on thread termination. Use existing mutex to prevent the deletion of the array from interfering with the global list of thread specific data (used for library termination) ticket: 2971 git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@17129 dc483132-0cff-0310-8789-dd5450dbe970 --- diff --git a/src/util/support/ChangeLog b/src/util/support/ChangeLog index 4686f935b..b0370a8df 100644 --- a/src/util/support/ChangeLog +++ b/src/util/support/ChangeLog @@ -1,3 +1,11 @@ +2005-03-20 Alexandra Ellwood + + * threads.c (thread_termination): Free array of pointers + to thread-specific data (t) on thread termination. Use + existing mutex to prevent the deletion of the array from + interfering with the global list of thread specific data + (used for library termination). + 2005-02-08 Ken Raeburn * threads.c (k5_key_delete) [pthread case]: Reset flags and diff --git a/src/util/support/threads.c b/src/util/support/threads.c index 51ad78814..e1e56e20d 100644 --- a/src/util/support/threads.c +++ b/src/util/support/threads.c @@ -117,30 +117,36 @@ static void thread_termination(void *); static void thread_termination (void *tptr) { - int i, pass, none_found; - struct tsd_block *t = tptr; - - /* Make multiple passes in case, for example, a libkrb5 cleanup - function wants to print out an error message, which causes - com_err to allocate a thread-specific buffer, after we just - freed up the old one. - - Shouldn't actually happen, if we're careful, but check just in - case. */ - - pass = 0; - none_found = 0; - while (pass < 4 && !none_found) { - none_found = 1; - for (i = 0; i < K5_KEY_MAX; i++) { - if (destructors_set[i] && destructors[i] && t->values[i]) { - void *v = t->values[i]; - t->values[i] = 0; - (*destructors[i])(v); - none_found = 0; - } - } - } + int err = k5_mutex_lock(&key_lock); + if (err == 0) { + int i, pass, none_found; + struct tsd_block *t = tptr; + + /* Make multiple passes in case, for example, a libkrb5 cleanup + function wants to print out an error message, which causes + com_err to allocate a thread-specific buffer, after we just + freed up the old one. + + Shouldn't actually happen, if we're careful, but check just in + case. */ + + pass = 0; + none_found = 0; + while (pass < 4 && !none_found) { + none_found = 1; + for (i = 0; i < K5_KEY_MAX; i++) { + if (destructors_set[i] && destructors[i] && t->values[i]) { + void *v = t->values[i]; + t->values[i] = 0; + (*destructors[i])(v); + none_found = 0; + } + } + } + free (t); + err = k5_mutex_unlock(&key_lock); + } + /* remove thread from global linked list */ }