r18489 - gnucash/trunk/src - Free memory leaks

Phil Longstaff plongstaff at code.gnucash.org
Fri Dec 11 19:15:50 EST 2009


Author: plongstaff
Date: 2009-12-11 19:15:50 -0500 (Fri, 11 Dec 2009)
New Revision: 18489
Trac: http://svn.gnucash.org/trac/changeset/18489

Modified:
   gnucash/trunk/src/backend/dbi/gnc-backend-dbi.c
   gnucash/trunk/src/backend/sql/gnc-backend-sql.c
   gnucash/trunk/src/backend/sql/gnc-slots-sql.c
   gnucash/trunk/src/engine/SX-book.c
   gnucash/trunk/src/libqof/backend/file/qsf-xml-map.c
   gnucash/trunk/src/libqof/backend/file/qsf-xml.c
   gnucash/trunk/src/libqof/qof/qofbook.c
Log:
Free memory leaks


Modified: gnucash/trunk/src/backend/dbi/gnc-backend-dbi.c
===================================================================
--- gnucash/trunk/src/backend/dbi/gnc-backend-dbi.c	2009-12-11 19:57:17 UTC (rev 18488)
+++ gnucash/trunk/src/backend/dbi/gnc-backend-dbi.c	2009-12-12 00:15:50 UTC (rev 18489)
@@ -626,6 +626,10 @@
         dbi_conn_close( be->conn );
 		be->conn = NULL;
 	}
+	if( be->sql_be.conn != NULL ) {
+		gnc_sql_connection_dispose( be->sql_be.conn );
+		be->sql_be.conn = NULL;
+    }
 	gnc_sql_finalize_version_info( &be->sql_be );
 
     LEAVE (" ");
@@ -636,6 +640,8 @@
 {
 	g_return_if_fail( be != NULL );
 
+	qof_backend_destroy( be );
+
     g_free( be );
 }
 

Modified: gnucash/trunk/src/backend/sql/gnc-backend-sql.c
===================================================================
--- gnucash/trunk/src/backend/sql/gnc-backend-sql.c	2009-12-11 19:57:17 UTC (rev 18488)
+++ gnucash/trunk/src/backend/sql/gnc-backend-sql.c	2009-12-12 00:15:50 UTC (rev 18489)
@@ -1082,11 +1082,14 @@
     	getter = gnc_sql_get_getter( obj_name, table_row );
 		if( getter != NULL ) {
     		s = (gchar*)(*getter)( pObject, NULL );
+			if( s != NULL ) {
+			    s = g_strdup( s );
+			}
 		}
 	}
 	(void)g_value_init( value, G_TYPE_STRING );
     if( s ) {
-        g_value_set_string( value, s );
+        g_value_take_string( value, s );
 	}
 
 	(*pList) = g_slist_append( (*pList), value );
@@ -2350,6 +2353,21 @@
 	}
 }
 
+static void
+free_gvalue_list( GSList* list )
+{
+    GSList* node;
+	GValue* value;
+
+	for( node = list; node != NULL; node = node->next ) {
+	    value = (GValue*)node->data;
+
+		g_value_unset( value );
+		g_free( value );
+	}
+	g_slist_free( list );
+}
+
 /*@ null @*/ static GncSqlStatement*
 build_insert_statement( GncSqlBackend* be,
                         const gchar* table_name,
@@ -2409,9 +2427,8 @@
 		(void)g_string_append( sql, value_str );
 		g_free( value_str );
 		(void)g_value_reset( value );
-		g_free( value );
 	}
-	g_slist_free( values );
+	free_gvalue_list( values );
 	(void)g_string_append( sql, ")" );
 
 	stmt = gnc_sql_connection_create_statement_from_sql( be->conn, sql->str );
@@ -2470,13 +2487,15 @@
 			(void)g_string_append( sql, "," );
 		}
 		(void)g_string_append( sql, (gchar*)colname->data );
-		g_free( colname->data );
 		(void)g_string_append( sql, "=" );
 		value_str = gnc_sql_get_sql_value( be->conn, (GValue*)(value->data) );
 		(void)g_string_append( sql, value_str );
 		g_free( value_str );
 		firstCol = FALSE;
 	}
+	for( colname = colnames; colname != NULL; colname = colname->next ) {
+		g_free( colname->data );
+	}
 	g_list_free( colnames );
 	if( value != NULL || colname != NULL ) {
 		PERR( "Mismatch in number of column names and values" );
@@ -2484,10 +2503,7 @@
 
 	stmt = gnc_sql_connection_create_statement_from_sql( be->conn, sql->str );
 	gnc_sql_statement_add_where_cond( stmt, obj_name, pObject, &table[0], (GValue*)(values->data) );
-    for( value = values; value != NULL; value = value->next ) {
-		g_free( value->data );
-    }
-	g_slist_free( values );
+	free_gvalue_list( values );
 	(void)g_string_free( sql, TRUE );
 
 	return stmt;
@@ -2520,6 +2536,7 @@
 	pHandler->add_gvalue_to_slist_fn( be, obj_name, pObject, table, &list );
 	g_assert( list != NULL );
 	gnc_sql_statement_add_where_cond( stmt, obj_name, pObject, &table[0], (GValue*)(list->data) );
+	free_gvalue_list( list );
 
 	return stmt;
 }
@@ -2770,7 +2787,10 @@
 {
 	g_return_if_fail( be != NULL );
 
-	g_hash_table_destroy( be->versions );
+	if( be->versions != NULL ) {
+	    g_hash_table_destroy( be->versions );
+	    be->versions = NULL;
+	}
 }
 
 /**

Modified: gnucash/trunk/src/backend/sql/gnc-slots-sql.c
===================================================================
--- gnucash/trunk/src/backend/sql/gnc-slots-sql.c	2009-12-11 19:57:17 UTC (rev 18488)
+++ gnucash/trunk/src/backend/sql/gnc-slots-sql.c	2009-12-12 00:15:50 UTC (rev 18489)
@@ -435,7 +435,6 @@
     GncSqlResult* result;
     gchar guid_buf[GUID_ENCODING_LENGTH+1];
     GncSqlStatement* stmt;
-    GValue value;
 	const GUID* guid;
 	KvpFrame* pFrame;
 
@@ -445,9 +444,6 @@
 	guid = qof_instance_get_guid( inst );
 	pFrame = qof_instance_get_slots( inst );
     (void)guid_to_string_buff( guid, guid_buf );
-    memset( &value, 0, sizeof( value ) );
-    (void)g_value_init( &value, G_TYPE_STRING );
-    g_value_set_string( &value, guid_buf );
 
 	buf = g_strdup_printf( "SELECT * FROM %s WHERE obj_guid='%s'", TABLE_NAME, guid_buf );
 	stmt = gnc_sql_create_statement_from_sql( be, buf );

Modified: gnucash/trunk/src/engine/SX-book.c
===================================================================
--- gnucash/trunk/src/engine/SX-book.c	2009-12-11 19:57:17 UTC (rev 18488)
+++ gnucash/trunk/src/engine/SX-book.c	2009-12-12 00:15:50 UTC (rev 18489)
@@ -253,8 +253,20 @@
      sxes->sx_list = NULL;
      sxes->sx_notsaved = TRUE;
      qof_collection_set_data(col, sxes);
+}
 
-     /* XXX: FIXME:  MEMORY LEAK.  This object is never freed. */
+static void
+book_sxes_end(QofBook* book)
+{
+     QofCollection *col;
+     SchedXactions *sxes;
+
+     col = qof_book_get_collection(book, GNC_ID_SCHEDXACTION);
+	 sxes = qof_collection_get_data(col);
+	 if (sxes != NULL) {
+	     g_object_unref(sxes);
+	     qof_collection_set_data(col, NULL);
+    }
 }
 
 static void
@@ -300,7 +312,7 @@
   .type_label        = "Scheduled Transactions List",
   .create            = NULL,
   .book_begin        = book_sxes_setup,
-  .book_end          = NULL,
+  .book_end          = book_sxes_end,
   .is_dirty          = book_sxlist_notsaved,
   .mark_clean        = book_sxns_mark_saved,
   .foreach           = NULL,

Modified: gnucash/trunk/src/libqof/backend/file/qsf-xml-map.c
===================================================================
--- gnucash/trunk/src/libqof/backend/file/qsf-xml-map.c	2009-12-11 19:57:17 UTC (rev 18488)
+++ gnucash/trunk/src/libqof/backend/file/qsf-xml-map.c	2009-12-12 00:15:50 UTC (rev 18489)
@@ -311,6 +311,7 @@
 	doc = xmlParseFile(path);
 	if(doc == NULL) { return FALSE; }
 	if(TRUE != qsf_is_valid(QSF_SCHEMA_DIR, QSF_MAP_SCHEMA, doc)) {
+	    xmlFreeDoc(doc);
 		return FALSE;
 	}
 	map_root = xmlDocGetRootElement(doc);

Modified: gnucash/trunk/src/libqof/backend/file/qsf-xml.c
===================================================================
--- gnucash/trunk/src/libqof/backend/file/qsf-xml.c	2009-12-11 19:57:17 UTC (rev 18488)
+++ gnucash/trunk/src/libqof/backend/file/qsf-xml.c	2009-12-12 00:15:50 UTC (rev 18489)
@@ -83,6 +83,7 @@
 	xmlSchemaFreeParserCtxt(qsf_schema_file);
 	xmlSchemaFreeValidCtxt(qsf_context);
 	xmlSchemaFree(qsf_schema);
+	g_free(schema_path);
 	if(result == 0) { return TRUE; }
 	return FALSE;
 }
@@ -155,6 +156,7 @@
 	if(TRUE != qsf_is_valid(QSF_SCHEMA_DIR, QSF_OBJECT_SCHEMA, doc)) { 
 		PINFO (" validation failed %s %s %s", QSF_SCHEMA_DIR, 
 			QSF_OBJECT_SCHEMA, path);
+		xmlFreeDoc(doc);
 		return FALSE; 
 	}
 	object_root = xmlDocGetRootElement(doc);
@@ -178,7 +180,11 @@
 	if(path == NULL) { return FALSE; }
 	doc = xmlParseFile(path);
 	if(doc == NULL) { return FALSE; }
-	if(TRUE != qsf_is_valid(QSF_SCHEMA_DIR, QSF_OBJECT_SCHEMA, doc)) { return FALSE; }
+	if(TRUE != qsf_is_valid(QSF_SCHEMA_DIR, QSF_OBJECT_SCHEMA, doc)) {
+		xmlFreeDoc(doc);
+	    return FALSE;
+	}
+	xmlFreeDoc(doc);
 	/* Note cannot test against a map here, so if the file is valid QSF,
 	accept it and work out the details later. */
 	return TRUE;

Modified: gnucash/trunk/src/libqof/qof/qofbook.c
===================================================================
--- gnucash/trunk/src/libqof/qof/qofbook.c	2009-12-11 19:57:17 UTC (rev 18488)
+++ gnucash/trunk/src/libqof/qof/qofbook.c	2009-12-12 00:15:50 UTC (rev 18489)
@@ -146,7 +146,7 @@
     cols = book->hash_of_collections;
     g_object_unref (book);
     g_hash_table_destroy (cols);
-    book->hash_of_collections = NULL;
+    /*book->hash_of_collections = NULL;*/
 
     LEAVE ("book=%p", book);
 }



More information about the gnucash-changes mailing list