--- gmodule/gmodule-dl.c.orig 2017-10-27 19:42:55.000000000 -0500 +++ gmodule/gmodule-dl.c 2017-11-22 21:54:27.000000000 -0600 @@ -134,22 +134,18 @@ _g_module_close (gpointer handle, gboolean is_unref) { - /* are there any systems out there that have dlopen()/dlclose() - * without a reference count implementation? + /* Intentionally not dlclose()ing because it is safer to leave the library + * loaded in memory than to close it and possibly leave dangling pointers + * to things like atexit handlers, atfork handlers, blocks, etc. * - * See above for the Android special case + * See https://trac.macports.org/ticket/45309 for an example from when + * a library used by a module added a new dependency which had an + * initializer which added a child atfork handler. The result is that + * after closing the module, the system had a dangling pointer for the + * atfork handler which would at best crash on the child side of fork() + * and at worst lead to arbitrary code execution of whatever happened to be + * at that location in memory at a later time in the process. */ -#if defined(__BIONIC__) - is_unref = (handle != RTLD_DEFAULT); -#else - is_unref |= 1; -#endif - - if (is_unref) - { - if (dlclose (handle) != 0) - g_module_set_error (fetch_dlerror (TRUE)); - } } static gpointer