From e22b05f1f83119c6c9fcc80559c129b35eb1fb56 Mon Sep 17 00:00:00 2001 From: Alexandra Ellwood Date: Mon, 21 Mar 2005 19:59:29 +0000 Subject: [PATCH] pullup from trunk ticket: 2971 git-svn-id: svn://anonsvn.mit.edu/krb5/branches/krb5-1-4@17130 dc483132-0cff-0310-8789-dd5450dbe970 --- src/util/support/ChangeLog | 8 ++++++ src/util/support/threads.c | 54 +++++++++++++++++++++----------------- 2 files changed, 38 insertions(+), 24 deletions(-) diff --git a/src/util/support/ChangeLog b/src/util/support/ChangeLog index 5db19b86e..ae56c7094 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). + 2004-12-15 Jeffrey Altman * Makefile.in: rename krb5support_32.dll to k5sprt32.dll diff --git a/src/util/support/threads.c b/src/util/support/threads.c index eb27f1cf9..4e6bbfc8d 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 */ } -- 2.26.2