Rewrap and fix double free bug by leaking a bit.

2008-08-21  Johan Dahlin  <johan@gnome.org>

    * girepository/girepository.c (g_irepository_require):
    Rewrap and fix double free bug by leaking a bit.


svn path=/trunk/; revision=430
This commit is contained in:
Johan Dahlin 2008-08-21 06:47:49 +00:00 committed by Johan Dahlin
parent c09cf789a0
commit 790ba0d7b0

View File

@ -520,48 +520,61 @@ g_irepository_require (GIRepository *repository,
fname = g_strconcat (namespace, ".typelib", NULL); fname = g_strconcat (namespace, ".typelib", NULL);
for (ldir = search_path; ldir; ldir = ldir->next) { for (ldir = search_path; ldir; ldir = ldir->next)
dir = ldir->data; {
full_path = g_build_filename (dir, fname, NULL); Header *header;
full_path = g_build_filename (ldir->data, fname, NULL);
mfile = g_mapped_file_new (full_path, FALSE, &error1); mfile = g_mapped_file_new (full_path, FALSE, &error1);
if (error1) { if (error1)
{
g_clear_error (&error1); g_clear_error (&error1);
g_free (full_path); g_free (full_path);
continue; continue;
} }
typelib = g_typelib_new_from_mapped_file (mfile); typelib = g_typelib_new_from_mapped_file (mfile);
typelib_namespace = g_typelib_get_string (typelib, ((Header *) typelib->data)->namespace); header = (Header *) typelib->data;
if (strcmp (typelib_namespace, namespace) != 0) { typelib_namespace = g_typelib_get_string (typelib, header->namespace);
if (strcmp (typelib_namespace, namespace) != 0)
{
g_free (full_path); g_free (full_path);
g_set_error (error, G_IREPOSITORY_ERROR, g_set_error (error, G_IREPOSITORY_ERROR,
G_IREPOSITORY_ERROR_NAMESPACE_MISMATCH, G_IREPOSITORY_ERROR_NAMESPACE_MISMATCH,
"Typelib file %s for namespace '%s' contains namespace '%s'" "Typelib file %s for namespace '%s' contains "
" which doesn't match the file name", "namespace '%s' which doesn't match the file name",
full_path, namespace, typelib_namespace); full_path, namespace, typelib_namespace);
return NULL; return NULL;
} }
break; break;
} }
g_free (fname);
if (typelib == NULL) { if (typelib == NULL)
g_free (full_path); {
g_set_error (error, G_IREPOSITORY_ERROR, g_set_error (error, G_IREPOSITORY_ERROR,
G_IREPOSITORY_ERROR_TYPELIB_NOT_FOUND, G_IREPOSITORY_ERROR_TYPELIB_NOT_FOUND,
"Typelib file for namespace '%s' was not found in search" "Typelib file for namespace '%s' was not found in search"
" path or could not be openened", namespace); " path or could not be openened", namespace);
return NULL; return NULL;
} }
g_free (fname);
/* optionally load shared library and attach it to the typelib */ /* optionally load shared library and attach it to the typelib */
shlib = ((Header *) typelib->data)->shared_library; shlib = ((Header *) typelib->data)->shared_library;
if (shlib) { if (shlib)
{
shlib_fname = g_typelib_get_string (typelib, shlib); shlib_fname = g_typelib_get_string (typelib, shlib);
module = g_module_open (shlib_fname, G_MODULE_BIND_LAZY|G_MODULE_BIND_LOCAL); module = g_module_open (shlib_fname,
if (module == NULL) { G_MODULE_BIND_LAZY|G_MODULE_BIND_LOCAL);
if (module == NULL)
{
g_free (full_path); g_free (full_path);
g_set_error (error, G_IREPOSITORY_ERROR, g_set_error (error, G_IREPOSITORY_ERROR,
G_IREPOSITORY_ERROR_TYPELIB_NOT_FOUND, G_IREPOSITORY_ERROR_TYPELIB_NOT_FOUND,
"Typelib for namespace '%s' references shared library %s," "Typelib for namespace '%s' references shared library "
" but it could not be openened (%s)", "%s, but it could not be openened (%s)",
namespace, shlib_fname, g_module_error ()); namespace, shlib_fname, g_module_error ());
return NULL; return NULL;
} }