diff options
author | Johan Dahlin <johan@gnome.org> | 2008-08-21 16:38:03 +0000 |
---|---|---|
committer | Johan Dahlin <johan@src.gnome.org> | 2008-08-21 16:38:03 +0000 |
commit | 384723fe482a65c7b7f6da8e8bc73f4ad06aa2e0 (patch) | |
tree | 4bc5aaa053b6202120f88b975e193e42d4e0d3a5 /girepository/girepository.c | |
parent | 245d0a5c471e36cf0f6659b99247a142674ce0df (diff) | |
download | gobject-introspection-384723fe482a65c7b7f6da8e8bc73f4ad06aa2e0.tar.gz |
Plug memory leak and avoid using freed memory. Resolve the whole module
2008-08-21 Johan Dahlin <johan@gnome.org>
* girepository/girepository.c (g_irepository_require):
Plug memory leak and avoid using freed memory.
Resolve the whole module path, here as well.
svn path=/trunk/; revision=441
Diffstat (limited to 'girepository/girepository.c')
-rw-r--r-- | girepository/girepository.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/girepository/girepository.c b/girepository/girepository.c index 3898c4f8..cf18a2e8 100644 --- a/girepository/girepository.c +++ b/girepository/girepository.c @@ -529,7 +529,6 @@ g_irepository_require (GIRepository *repository, if (error1) { g_clear_error (&error1); - g_free (full_path); continue; } @@ -539,12 +538,12 @@ g_irepository_require (GIRepository *repository, if (strcmp (typelib_namespace, namespace) != 0) { - g_free (full_path); g_set_error (error, G_IREPOSITORY_ERROR, G_IREPOSITORY_ERROR_NAMESPACE_MISMATCH, "Typelib file %s for namespace '%s' contains " "namespace '%s' which doesn't match the file name", full_path, namespace, typelib_namespace); + g_free (full_path); return NULL; } break; @@ -552,11 +551,11 @@ g_irepository_require (GIRepository *repository, if (typelib == NULL) { - g_free (full_path); g_set_error (error, G_IREPOSITORY_ERROR, G_IREPOSITORY_ERROR_TYPELIB_NOT_FOUND, "Typelib file for namespace '%s' was not found in search" " path or could not be openened", namespace); + g_free (full_path); return NULL; } @@ -566,19 +565,25 @@ g_irepository_require (GIRepository *repository, shlib = ((Header *) typelib->data)->shared_library; if (shlib) { + gchar *resolved_shlib; + shlib_fname = g_typelib_get_string (typelib, shlib); - module = g_module_open (shlib_fname, + resolved_shlib = g_module_build_path (NULL, shlib_fname); + + module = g_module_open (resolved_shlib, G_MODULE_BIND_LAZY|G_MODULE_BIND_LOCAL); if (module == NULL) { - g_free (full_path); g_set_error (error, G_IREPOSITORY_ERROR, G_IREPOSITORY_ERROR_TYPELIB_NOT_FOUND, "Typelib for namespace '%s' references shared library " "%s, but it could not be openened (%s)", - namespace, shlib_fname, g_module_error ()); + namespace, resolved_shlib, g_module_error ()); + g_free (full_path); + g_free (resolved_shlib); return NULL; } + g_free (resolved_shlib); } g_hash_table_remove (table, namespace); |