gobject-introspection r430 - in trunk: . girepository



Author: johan
Date: Thu Aug 21 06:47:49 2008
New Revision: 430
URL: http://svn.gnome.org/viewvc/gobject-introspection?rev=430&view=rev

Log:
2008-08-21  Johan Dahlin  <johan gnome org>

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



Modified:
   trunk/ChangeLog
   trunk/girepository/girepository.c

Modified: trunk/girepository/girepository.c
==============================================================================
--- trunk/girepository/girepository.c	(original)
+++ trunk/girepository/girepository.c	Thu Aug 21 06:47:49 2008
@@ -520,52 +520,65 @@
 
   fname = g_strconcat (namespace, ".typelib", NULL);
 
-  for (ldir = search_path; ldir; ldir = ldir->next) {
-    dir = ldir->data;
-    full_path = g_build_filename (dir, fname, NULL);
-    mfile = g_mapped_file_new (full_path, FALSE, &error1);
-    if (error1) {
-      g_clear_error (&error1);
-      g_free (full_path);
-      continue;
-    }
-    typelib = g_typelib_new_from_mapped_file (mfile);
-    typelib_namespace = g_typelib_get_string (typelib, ((Header *) typelib->data)->namespace);
-    if (strcmp (typelib_namespace, namespace) != 0) {
-      g_free (full_path);
+  for (ldir = search_path; ldir; ldir = ldir->next)
+    {
+      Header *header;
+      
+      full_path = g_build_filename (ldir->data, fname, NULL);
+      mfile = g_mapped_file_new (full_path, FALSE, &error1);
+      if (error1)
+	{
+	  g_clear_error (&error1);
+	  g_free (full_path);
+	  continue;
+	}
+
+      typelib = g_typelib_new_from_mapped_file (mfile);
+      header = (Header *) typelib->data;
+      typelib_namespace = g_typelib_get_string (typelib, header->namespace);
+
+      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);
+	  return NULL; 
+	}
+      break;
+  }
+
+  if (typelib == NULL)
+    {
       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);
-      return NULL; 
+		   G_IREPOSITORY_ERROR_TYPELIB_NOT_FOUND,
+		   "Typelib file for namespace '%s' was not found in search"
+		   " path or could not be openened", namespace);
+      return NULL;
     }
-    break;
-  }
+
   g_free (fname);
-  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);
-    return NULL;
-  }
+  
   /* optionally load shared library and attach it to the typelib */
   shlib = ((Header *) typelib->data)->shared_library;
-  if (shlib) {
-    shlib_fname = g_typelib_get_string (typelib, shlib);
-    module = g_module_open (shlib_fname, 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 ());
-      return NULL;
+  if (shlib)
+    {
+      shlib_fname = g_typelib_get_string (typelib, shlib);
+      module = g_module_open (shlib_fname,
+			      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 ());
+	  return NULL;
+	}
     }
-  }
 
   g_hash_table_remove (table, namespace);
   register_internal (repository, full_path, typelib);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]