From: Jeffrey Altman Date: Mon, 17 Jan 2005 23:57:51 +0000 (+0000) Subject: Some applications such as Eudora on Windows load and unload the Kerberos X-Git-Tag: ms-bug-test-20060525~366 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=191783e634d17927051337359f9abbe32c0e5b2e;p=krb5.git Some applications such as Eudora on Windows load and unload the Kerberos libraries as part of a plug-in. Plugins are often loaded for a specific purpose and then unregistered. In order to support this model, the libraries must restore the library state to the uninitialized state when the library is unloaded. ticket: new git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@17050 dc483132-0cff-0310-8789-dd5450dbe970 --- diff --git a/src/lib/gssapi/ChangeLog b/src/lib/gssapi/ChangeLog index 90ac10e40..af50c5e46 100644 --- a/src/lib/gssapi/ChangeLog +++ b/src/lib/gssapi/ChangeLog @@ -1,3 +1,7 @@ +2005-01-17 Jeffrey Altman + + * gss_libinit.c: implement cleanup of mutexes, static vars, etc for Windows + 2004-07-29 Sam Hartman * libgssapi_krb5.exports: Add lucid context routines and gss_krb5_set_allowable_enctypes diff --git a/src/lib/gssapi/gss_libinit.c b/src/lib/gssapi/gss_libinit.c index a43989f0c..d45ac440c 100644 --- a/src/lib/gssapi/gss_libinit.c +++ b/src/lib/gssapi/gss_libinit.c @@ -41,7 +41,10 @@ void gssint_lib_fini(void) remove_error_table(&et_k5g_error_table); remove_error_table(&et_ggss_error_table); #endif + k5_key_delete(K5_KEY_GSS_KRB5_SET_CCACHE_OLD_NAME); + k5_key_delete(K5_KEY_GSS_KRB5_CCACHE_NAME); k5_mutex_destroy(&kg_vdb.mutex); + k5_mutex_destroy(&gssint_krb5_keytab_lock); } OM_uint32 gssint_initialize_library (void) diff --git a/src/lib/krb5/ChangeLog b/src/lib/krb5/ChangeLog index 97a7fe32c..882c9e0f4 100644 --- a/src/lib/krb5/ChangeLog +++ b/src/lib/krb5/ChangeLog @@ -1,3 +1,7 @@ +2005-01-17 Jeffrey Altman + + * krb5_libinit.c: implement library cleanup of mutexes, static vars, etc + 2005-01-04 Jeffrey Altman * libkrb5.exports: add krb5_is_thread_safe diff --git a/src/lib/krb5/krb5_libinit.c b/src/lib/krb5/krb5_libinit.c index 8290c1476..ece79cfc7 100644 --- a/src/lib/krb5/krb5_libinit.c +++ b/src/lib/krb5/krb5_libinit.c @@ -69,9 +69,11 @@ void krb5int_lib_fini(void) if (!INITIALIZER_RAN(krb5int_lib_init) || PROGRAM_EXITING()) return; - krb5int_rc_terminate(); - krb5int_kt_finalize(); + k5_mutex_destroy(&krb5int_us_time_mutex); + krb5int_cc_finalize(); + krb5int_kt_finalize(); + krb5int_rc_terminate(); #if defined(_WIN32) || defined(USE_CCAPI) krb5_stdcc_shutdown(); diff --git a/src/util/et/ChangeLog b/src/util/et/ChangeLog index eeec13ebd..bec740722 100644 --- a/src/util/et/ChangeLog +++ b/src/util/et/ChangeLog @@ -1,3 +1,7 @@ +2005-01-17 Jeffrey Altman + + * error_message.c: implement library unload cleanup of mutexes + 2005-01-13 Ken Raeburn * error_message.c (com_err_terminate): Lock the list mutex before diff --git a/src/util/et/error_message.c b/src/util/et/error_message.c index 8bef6804d..e60029b5c 100644 --- a/src/util/et/error_message.c +++ b/src/util/et/error_message.c @@ -62,6 +62,8 @@ void com_err_terminate(void) struct dynamic_et_list *e, *enext; if (! INITIALIZER_RAN(com_err_initialize) || PROGRAM_EXITING()) return; + k5_key_delete(K5_KEY_COM_ERR); + k5_mutex_destroy(&com_err_hook_lock); k5_mutex_lock(&et_list_lock); for (e = et_list_dynamic; e; e = enext) { enext = e->next; diff --git a/src/util/support/ChangeLog b/src/util/support/ChangeLog index 4e0aaa679..010995392 100644 --- a/src/util/support/ChangeLog +++ b/src/util/support/ChangeLog @@ -1,3 +1,8 @@ +2005-01-17 Jeffrey Altman + + * threads.c: implement cleanup of static vars on library + unload (for Windows) + 2005-01-14 Ken Raeburn * threads.c (k5_mutex_lock_update_stats, diff --git a/src/util/support/threads.c b/src/util/support/threads.c index 44b64201f..c8d4199d1 100644 --- a/src/util/support/threads.c +++ b/src/util/support/threads.c @@ -305,6 +305,9 @@ int k5_key_delete (k5_key_t keynum) /* XXX Memory leak here! Need to destroy the associated data for all threads. But watch for race conditions in case threads are going away too. */ + assert(destructors_set[keynum] == 1); + destructors_set[keynum] = 0; + destructors[keynum] = 0; LeaveCriticalSection(&key_lock); #else /* POSIX */