From 4a925177a81c2566d2a81a0a450607a5ff4d9048 Mon Sep 17 00:00:00 2001 From: Stefano Garzarella Date: Wed, 27 Feb 2019 12:25:20 +0100 Subject: [PATCH] modules: check gl.modules before iterates on it when freeing In some circumstances, as described in the BZ, can happen that free_modules_when_no_refs_unlocked() is called multiple times when the module destructor is invoked. We should check gl.modules before iterates on it in the free_modules_when_no_refs_unlocked() functions, to avoid a SIGSEGV. Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1680963 --- p11-kit/modules.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/p11-kit/modules.c b/p11-kit/modules.c index 0299eda..891ce4c 100644 --- a/p11-kit/modules.c +++ b/p11-kit/modules.c @@ -797,14 +797,16 @@ init_globals_unlocked (void) static void free_modules_when_no_refs_unlocked (void) { - Module *mod; - p11_dictiter iter; - - /* Check if any modules have a ref count */ - p11_dict_iterate (gl.modules, &iter); - while (p11_dict_next (&iter, (void **)&mod, NULL)) { - if (mod->ref_count) - return; + if (gl.modules) { + Module *mod; + p11_dictiter iter; + + /* Check if any modules have a ref count */ + p11_dict_iterate (gl.modules, &iter); + while (p11_dict_next (&iter, (void **)&mod, NULL)) { + if (mod->ref_count) + return; + } } p11_dict_free (gl.unmanaged_by_funcs); -- 2.20.1