threads.c (thread_termination): Free array of pointers to thread-specific data (t...
authorAlexandra Ellwood <lxs@mit.edu>
Sun, 20 Mar 2005 15:20:38 +0000 (15:20 +0000)
committerAlexandra Ellwood <lxs@mit.edu>
Sun, 20 Mar 2005 15:20:38 +0000 (15:20 +0000)
ticket: 2971

git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@17129 dc483132-0cff-0310-8789-dd5450dbe970

src/util/support/ChangeLog
src/util/support/threads.c

index 4686f935b50d3b15af4b88ba46846ac266941b15..b0370a8df24426d7e9a696fbe51a3ec672d16d3b 100644 (file)
@@ -1,3 +1,11 @@
+2005-03-20  Alexandra Ellwood  <lxs@mit.edu>
+
+       * 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  <raeburn@mit.edu>
 
        * threads.c (k5_key_delete) [pthread case]: Reset flags and
index 51ad788143dbf975e1d1ac803e5b94c0b009a351..e1e56e20da7eaf1982aa26b522363bbabf92a168 100644 (file)
@@ -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 */
 }