Fix double free of the targetList, Add kvp_value_to_bare_string

git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@10906 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
Neil Williams 2005-02-20 15:53:01 +00:00
parent 9f9ce9c60a
commit 26ad9d4348
6 changed files with 101 additions and 13 deletions

View File

@ -1,3 +1,16 @@
2005-02-20 Neil Williams <linux@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@ihtfp.com>
* src/gnome-utils/dialog-utils.c: When trying to load the symbol

View File

@ -496,8 +496,9 @@ kvp_frame_replace_value_nc (KvpFrame * frame, const char * key_path,
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);
@ -1635,6 +1636,81 @@ kvp_value_glist_to_string(const GList *list)
return tmp2;
}
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)
{

View File

@ -603,7 +603,17 @@ gint kvp_value_compare(const KvpValue *va, const KvpValue *vb);
/*@}*/
/** \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:

View File

@ -104,10 +104,6 @@ qof_book_merge_abort (qof_book_mergeData *mergeData)
}
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 @@ qof_book_mergeCommit( qof_book_mergeData *mergeData )
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);

View File

@ -269,8 +269,6 @@ qof_session_get_url (QofSession *session)
return session->book_id;
}
/* ====================================================================== */
#ifdef GNUCASH_MAJOR_VERSION
static void
@ -469,7 +467,7 @@ qof_session_begin (QofSession *session, const char * book_id,
/* 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.
*/

View File

@ -92,7 +92,6 @@
/* PROTOTYPES ******************************************************/
/** QofSession definition */
typedef struct _QofSession QofSession;
QofSession * qof_session_new (void);