diff --git a/docs/reference/ChangeLog b/docs/reference/ChangeLog index f1ce3652e..d728ed2ce 100644 --- a/docs/reference/ChangeLog +++ b/docs/reference/ChangeLog @@ -1,3 +1,7 @@ +2006-12-13 Matthias Clasen + + * glib/tmpl/modules.sgml: Point out that valid symbols may be NULL. + 2006-10-08 Matthias Clasen * glib/tmpl/unicode.sgml: Document GUnicodeType. diff --git a/docs/reference/glib/tmpl/modules.sgml b/docs/reference/glib/tmpl/modules.sgml index 56aa90d35..19deefe0f 100644 --- a/docs/reference/glib/tmpl/modules.sgml +++ b/docs/reference/glib/tmpl/modules.sgml @@ -71,6 +71,22 @@ just_say_hello (const char *filename, GError **error) return FALSE; } + if (say_hello == NULL) + { + g_set_error (error, SAY_ERROR, SAY_ERROR_OPEN, "symbol say_hello is NULL"); + if (!g_module_close (module)) + g_warning ("%s: %s", filename, g_module_error ()); + return FALSE; + } + + if (say_hello == NULL) + { + g_set_error (error, SAY_ERROR, SAY_ERROR_OPEN, "symbol say_hello is NULL"); + if (!g_module_close (module)) + g_warning ("%s: %s", filename, g_module_error ()); + return FALSE; + } + /* call our function in the module */ say_hello ("Hello world!"); @@ -177,6 +193,12 @@ not supported on all platforms. Gets a symbol pointer from a module. + +Note that a valid symbol can be %NULL. + + +Note that a valid symbol can be %NULL. + @module: a #GModule. @symbol_name: the name of the symbol to find. diff --git a/gmodule/ChangeLog b/gmodule/ChangeLog index 9090e2f53..819cb23fd 100644 --- a/gmodule/ChangeLog +++ b/gmodule/ChangeLog @@ -1,3 +1,9 @@ +2006-12-13 Matthias Clasen + + * gmodule.c (g_module_open): + * gmodule-dl.c (_g_module_symbol): Handle valid symbols + that are NULL correctly. (#385388, Felix Kater) + Mon Sep 11 14:58:56 2006 Tim Janik * gmodule.c: applied patch from Christian Persch to support diff --git a/gmodule/gmodule-dl.c b/gmodule/gmodule-dl.c index 08f87f3b2..ce3377767 100644 --- a/gmodule/gmodule-dl.c +++ b/gmodule/gmodule-dl.c @@ -96,7 +96,7 @@ _g_module_open (const gchar *file_name, gpointer handle; handle = dlopen (file_name, - (bind_local ? 0 : RTLD_GLOBAL) | (bind_lazy ? RTLD_LAZY : RTLD_NOW)); + (bind_local ? 0 : RTLD_GLOBAL) | (bind_lazy ? RTLD_LAZY : RTLD_NOW)); if (!handle) g_module_set_error (fetch_dlerror (TRUE)); @@ -140,10 +140,13 @@ _g_module_symbol (gpointer handle, const gchar *symbol_name) { gpointer p; - + gchar *msg; + + fetch_dlerror (FALSE); p = dlsym (handle, symbol_name); - if (!p) - g_module_set_error (fetch_dlerror (FALSE)); + msg = fetch_dlerror (FALSE); + if (msg) + g_module_set_error (msg); return p; } diff --git a/gmodule/gmodule.c b/gmodule/gmodule.c index 0ff4eaa41..75c4e709b 100644 --- a/gmodule/gmodule.c +++ b/gmodule/gmodule.c @@ -477,7 +477,7 @@ g_module_open (const gchar *file_name, modules = module; /* check initialization */ - if (g_module_symbol (module, "g_module_check_init", (gpointer) &check_init)) + if (g_module_symbol (module, "g_module_check_init", (gpointer) &check_init) && check_init != NULL) check_failed = check_init (module); /* we don't call unload() if the initialization check failed. */