[Gnucash-changes] Fix double free of the targetList, Add kvp_value_to_bare_string

Neil Williams codehelp at cvs.gnucash.org
Sun Feb 20 10:53:03 EST 2005


Log Message:
-----------
Fix double free of the targetList, Add kvp_value_to_bare_string

Modified Files:
--------------
    gnucash:
        ChangeLog
    gnucash/src/engine:
        kvp_frame.c
        kvp_frame.h
        qof_book_merge.c
        qofsession.c
        qofsession.h

Revision Data
-------------
Index: ChangeLog
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/ChangeLog,v
retrieving revision 1.1893
retrieving revision 1.1894
diff -LChangeLog -LChangeLog -u -r1.1893 -r1.1894
--- ChangeLog
+++ ChangeLog
@@ -1,3 +1,16 @@
+2005-02-20  Neil Williams  <linux at codehelp.co.uk>
+	* src/engine/qof_book_merge.c: Fix double free of the targetList
+	entities that cause xaccGroupGetNumSubAccounts to generate a
+	segmentation fault.
+	* src/engine/kvp_frame.c: 
+	* src/engine/kvp_frame.h:
+	Add kvp_value_to_bare_string to
+	generate strings without debug information.
+	* src/engine/qofsession.h:
+	* src/engine/qofsession.c:
+	Documentation tweaks to bring them into line with QOF and the
+	gnucash-gnome2-dev branch.
+
 2005-02-16  Derek Atkins  <derek at ihtfp.com>
 
 	* src/gnome-utils/dialog-utils.c: When trying to load the symbol
Index: qof_book_merge.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/qof_book_merge.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -Lsrc/engine/qof_book_merge.c -Lsrc/engine/qof_book_merge.c -u -r1.4 -r1.5
--- src/engine/qof_book_merge.c
+++ src/engine/qof_book_merge.c
@@ -104,10 +104,6 @@
 	}
 		mergeData->mergeList = g_list_next(mergeData->mergeList);
 	}
-	while(mergeData->targetList != NULL) {
-		g_free(mergeData->targetList->data);
-		mergeData->targetList = g_slist_next(mergeData->targetList);
-	}
 	g_list_free(mergeData->mergeList);
 	g_slist_free(mergeData->mergeObjectParams);
 	g_slist_free(mergeData->targetList);
@@ -286,10 +282,6 @@
 		g_slist_free(currentRule->linkedEntList);
 		mergeData->mergeList = g_list_next(mergeData->mergeList);
 	}
-	while(mergeData->targetList != NULL) {
-		g_free(mergeData->targetList->data);
-		mergeData->targetList = g_slist_next(mergeData->targetList);
-	}
 	g_list_free(mergeData->mergeList);
 	g_slist_free(mergeData->mergeObjectParams);
 	g_slist_free(mergeData->targetList);
Index: kvp_frame.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/kvp_frame.c,v
retrieving revision 1.42
retrieving revision 1.43
diff -Lsrc/engine/kvp_frame.c -Lsrc/engine/kvp_frame.c -u -r1.42 -r1.43
--- src/engine/kvp_frame.c
+++ src/engine/kvp_frame.c
@@ -496,8 +496,9 @@
                             KvpValue * new_value) 
 {
   KvpValue * old_value;
-  char *last_key = NULL;
+  char *last_key;
 
+  last_key = NULL;
   if (new_value)
   {
      frame = get_trailer_make (frame, key_path, &last_key);
@@ -1636,6 +1637,81 @@
 }
 
 gchar*
+kvp_value_to_bare_string(const KvpValue *val)
+{
+    gchar *tmp1;
+    gchar *tmp2;
+    const gchar *ctmp;
+    
+    g_return_val_if_fail(val, NULL);
+    
+    switch(kvp_value_get_type(val))
+    {
+    case KVP_TYPE_GINT64:
+        return g_strdup_printf("%lld",(long long int) kvp_value_get_gint64(val));
+        break;
+
+    case KVP_TYPE_DOUBLE:
+        return g_strdup_printf("(%g)", kvp_value_get_double(val));
+        break;
+
+    case KVP_TYPE_NUMERIC:
+        tmp1 = gnc_numeric_to_string(kvp_value_get_numeric(val));
+        tmp2 = g_strdup_printf("%s", tmp1 ? tmp1 : "");
+        g_free(tmp1);
+        return tmp2;
+        break;
+
+    case KVP_TYPE_STRING:
+        tmp1 = kvp_value_get_string (val);
+        return g_strdup_printf("%s", tmp1 ? tmp1 : "");
+        break;
+
+    case KVP_TYPE_GUID:
+        ctmp = guid_to_string(kvp_value_get_guid(val));
+        tmp2 = g_strdup_printf("%s", ctmp ? ctmp : "");
+        return tmp2;
+        break;
+
+    case KVP_TYPE_TIMESPEC:
+        tmp1 = g_new0 (char, 40);
+        gnc_timespec_to_iso8601_buff (kvp_value_get_timespec (val), tmp1);
+        tmp2 = g_strdup_printf("%s", tmp1);
+        g_free(tmp1);
+        return tmp2;
+        break;
+
+    case KVP_TYPE_BINARY:
+    {
+        guint64 len;
+        void *data;
+        data = kvp_value_get_binary(val, &len);
+        tmp1 = binary_to_string(data, len);
+        return g_strdup_printf("%s", tmp1 ? tmp1 : "");
+    }
+        break;
+ 
+    case KVP_TYPE_GLIST:
+        tmp1 = kvp_value_glist_to_string(kvp_value_get_glist(val));
+        tmp2 = g_strdup_printf("%s", tmp1 ? tmp1 : "");
+        g_free(tmp1);
+        return tmp2;
+        break;
+
+    case KVP_TYPE_FRAME:
+        tmp1 = kvp_frame_to_string(kvp_value_get_frame(val));
+        tmp2 = g_strdup_printf("%s", tmp1 ? tmp1 : "");
+        g_free(tmp1);
+        return tmp2;
+        break;
+
+    default:
+        return g_strdup_printf(" ");
+        break;
+    }
+}
+
+gchar*
 kvp_value_to_string(const KvpValue *val)
 {
     gchar *tmp1;
Index: qofsession.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/qofsession.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -Lsrc/engine/qofsession.c -Lsrc/engine/qofsession.c -u -r1.16 -r1.17
--- src/engine/qofsession.c
+++ src/engine/qofsession.c
@@ -269,8 +269,6 @@
    return session->book_id;
 }
 
-/* ====================================================================== */
-
 #ifdef GNUCASH_MAJOR_VERSION 
 
 static void
@@ -469,7 +467,7 @@
   /* destroy the old backend */
   qof_session_destroy_backend(session);
 
-  /* Look for somthing of the form of "file:/", "http://" or 
+  /* Look for something of the form of "file:/", "http://" or 
    * "postgres://". Everything before the colon is the access 
    * method.  Load the first backend found for that access method.
    */
Index: kvp_frame.h
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/kvp_frame.h,v
retrieving revision 1.36
retrieving revision 1.37
diff -Lsrc/engine/kvp_frame.h -Lsrc/engine/kvp_frame.h -u -r1.36 -r1.37
--- src/engine/kvp_frame.h
+++ src/engine/kvp_frame.h
@@ -603,7 +603,17 @@
 
 /*@}*/
 
+/** \brief General purpose function to convert any KvpValue to a string.
 
+Only the bare string is returned, there is no debugging information.
+*/
+gchar* kvp_value_to_bare_string(const KvpValue *val);
+
+/** \brief Debug version of kvp_value_to_string
+
+This version is used only by ::qof_query_printValueForParam,
+itself a debugging and development utility function.
+*/
 gchar* kvp_value_to_string(const KvpValue *val);
 
 /** Manipulator: 
Index: qofsession.h
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/qofsession.h,v
retrieving revision 1.9
retrieving revision 1.10
diff -Lsrc/engine/qofsession.h -Lsrc/engine/qofsession.h -u -r1.9 -r1.10
--- src/engine/qofsession.h
+++ src/engine/qofsession.h
@@ -92,7 +92,6 @@
 
 /* PROTOTYPES ******************************************************/
 
-/** QofSession definition */
 typedef struct _QofSession    QofSession;
 
 QofSession * qof_session_new (void);


More information about the gnucash-changes mailing list