krb5 commit: Add finalization safety check to com_err

Greg Hudson <[email protected]>
Newsgroups gmane.comp.encryption.kerberos.cvs
Message-ID <[email protected]>
https://github.com/krb5/krb5/commit/9d654aa05e26bbf22f140abde3436afeff2fdf8d
commit 9d654aa05e26bbf22f140abde3436afeff2fdf8d
Author: Jiri Sasek <[email protected]>
Date:   Fri Mar 13 19:02:58 2020 +0100

    Add finalization safety check to com_err
    
    If the linker erroneously runs the libkrb5 finalizer after the
    libcom_err finalizer, the consequent remove_error_table() calls could
    crash due to accessing a destroyed mutex or an invalid et_list
    pointer.  Add an unsynchronized check on finalized in
    remove_error_table(), and set et_list to null in com_err_terminate()
    after destroying the list.
    
    [[email protected]: minimized code hanges; rewrote comment and commit
    message]
    
    ticket: 8890 (new)

 src/util/et/error_message.c |    7 ++++++-
 1 files changed, 6 insertions(+), 1 deletions(-)

diff --git a/src/util/et/error_message.c b/src/util/et/error_message.c
index d7069a9..7dc02a3 100644
--- a/src/util/et/error_message.c
+++ b/src/util/et/error_message.c
@@ -26,7 +26,7 @@
 
 static struct et_list *et_list;
 static k5_mutex_t et_list_lock = K5_MUTEX_PARTIAL_INITIALIZER;
-static int terminated = 0;      /* for debugging shlib fini sequence errors */
+static int terminated = 0;      /* for safety and finalization debugging */
 
 MAKE_INIT_FUNCTION(com_err_initialize);
 MAKE_FINI_FUNCTION(com_err_terminate);
@@ -69,6 +69,7 @@ void com_err_terminate(void)
         enext = e->next;
         free(e);
     }
+    et_list = NULL;
     k5_mutex_unlock(&et_list_lock);
     k5_mutex_destroy(&et_list_lock);
     terminated = 1;
@@ -280,6 +281,10 @@ remove_error_table(const struct error_table *et)
 {
     struct et_list **ep, *e;
 
+    /* Safety check in case libraries are finalized in the wrong order. */
+    if (terminated)
+        return ENOENT;
+
     if (CALL_INIT_FUNCTION(com_err_initialize))
         return 0;
     k5_mutex_lock(&et_list_lock);
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.