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