Correct memory leak found with Valgrind.

git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@20733 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
J. Alex Aycinena 2011-06-03 08:24:27 +00:00
parent 5c1ea616e5
commit b83e53a9c5

View File

@ -159,7 +159,8 @@ int
gnc_guid_p(SCM guid_scm) gnc_guid_p(SCM guid_scm)
{ {
GncGUID guid; GncGUID guid;
const gchar * str; gchar * str;
int return_int;
if (!scm_is_string(guid_scm)) if (!scm_is_string(guid_scm))
return FALSE; return FALSE;
@ -168,9 +169,12 @@ gnc_guid_p(SCM guid_scm)
{ {
return FALSE; return FALSE;
} }
scm_dynwind_begin (0);
str = scm_to_locale_string (guid_scm); str = scm_to_locale_string (guid_scm);
return_int = string_to_guid(str, &guid);
return string_to_guid(str, &guid); scm_dynwind_free (str);
scm_dynwind_end ();
return return_int;
} }
@ -537,7 +541,7 @@ gnc_query_path_free (GSList *path)
} }
static KvpValueType static KvpValueType
gnc_scm2KvpValueTypeype (SCM value_type_scm) gnc_scm2KvpValueType (SCM value_type_scm)
{ {
return scm_num2int(value_type_scm, SCM_ARG1, G_STRFUNC); return scm_num2int(value_type_scm, SCM_ARG1, G_STRFUNC);
} }
@ -663,7 +667,7 @@ gnc_scm2KvpValue (SCM value_scm)
return NULL; return NULL;
type_scm = SCM_CAR (value_scm); type_scm = SCM_CAR (value_scm);
value_t = gnc_scm2KvpValueTypeype (type_scm); value_t = gnc_scm2KvpValueType (type_scm);
value_scm = SCM_CDR (value_scm); value_scm = SCM_CDR (value_scm);
if (!scm_is_list (value_scm) || scm_is_null (value_scm)) if (!scm_is_list (value_scm) || scm_is_null (value_scm))
@ -683,8 +687,12 @@ gnc_scm2KvpValue (SCM value_scm)
case KVP_TYPE_STRING: case KVP_TYPE_STRING:
{ {
const gchar * str = scm_to_locale_string (val_scm); gchar * str;
scm_dynwind_begin (0);
str = scm_to_locale_string (val_scm);
value = kvp_value_new_string (str); value = kvp_value_new_string (str);
scm_dynwind_free (str);
scm_dynwind_end ();
break; break;
} }
@ -785,7 +793,7 @@ gnc_scm2KvpFrame (SCM frame_scm)
KvpValue *value; KvpValue *value;
SCM key_scm; SCM key_scm;
SCM val_scm; SCM val_scm;
const gchar *key; gchar *key;
if (!scm_is_pair (pair)) if (!scm_is_pair (pair))
continue; continue;
@ -796,14 +804,24 @@ gnc_scm2KvpFrame (SCM frame_scm)
if (!scm_is_string (key_scm)) if (!scm_is_string (key_scm))
continue; continue;
scm_dynwind_begin (0);
key = scm_to_locale_string (key_scm); key = scm_to_locale_string (key_scm);
if (!key) if (!key)
{
scm_dynwind_free (key);
scm_dynwind_end ();
continue; continue;
}
value = gnc_scm2KvpValue (val_scm); value = gnc_scm2KvpValue (val_scm);
if (!value) continue; if (!value)
{
scm_dynwind_free (key);
scm_dynwind_end ();
continue;
}
kvp_frame_set_slot_nc (frame, key, value); kvp_frame_set_slot_nc (frame, key, value);
scm_dynwind_free (key);
scm_dynwind_end ();
} }
return frame; return frame;
@ -952,7 +970,7 @@ gnc_scm2query_term_query_v2 (SCM qt_scm)
{ {
QofStringMatch options; QofStringMatch options;
gboolean is_regex; gboolean is_regex;
const gchar *matchstring; gchar *matchstring;
scm = SCM_CAR (qt_scm); scm = SCM_CAR (qt_scm);
qt_scm = SCM_CDR (qt_scm); qt_scm = SCM_CDR (qt_scm);
@ -968,10 +986,13 @@ gnc_scm2query_term_query_v2 (SCM qt_scm)
qt_scm = SCM_CDR (qt_scm); qt_scm = SCM_CDR (qt_scm);
if (!scm_is_string (scm)) break; if (!scm_is_string (scm)) break;
scm_dynwind_begin (0);
matchstring = scm_to_locale_string (scm); matchstring = scm_to_locale_string (scm);
pd = qof_query_string_predicate (compare_how, matchstring, pd = qof_query_string_predicate (compare_how, matchstring,
options, is_regex); options, is_regex);
scm_dynwind_free (matchstring);
scm_dynwind_end ();
} }
else if (!safe_strcmp (type, QOF_TYPE_DATE)) else if (!safe_strcmp (type, QOF_TYPE_DATE))
{ {
@ -1077,7 +1098,7 @@ gnc_scm2query_term_query_v2 (SCM qt_scm)
else if (!safe_strcmp (type, QOF_TYPE_CHAR)) else if (!safe_strcmp (type, QOF_TYPE_CHAR))
{ {
QofCharMatch options; QofCharMatch options;
const gchar *char_list; gchar *char_list;
scm = SCM_CAR (qt_scm); scm = SCM_CAR (qt_scm);
qt_scm = SCM_CDR (qt_scm); qt_scm = SCM_CDR (qt_scm);
@ -1089,9 +1110,12 @@ gnc_scm2query_term_query_v2 (SCM qt_scm)
qt_scm = SCM_CDR (qt_scm); qt_scm = SCM_CDR (qt_scm);
if (!scm_is_string (scm)) if (!scm_is_string (scm))
break; break;
scm_dynwind_begin (0);
char_list = scm_to_locale_string (scm); char_list = scm_to_locale_string (scm);
pd = qof_query_char_predicate (options, char_list); pd = qof_query_char_predicate (options, char_list);
scm_dynwind_free (char_list);
scm_dynwind_end ();
} }
else if (!safe_strcmp (type, QOF_TYPE_KVP)) else if (!safe_strcmp (type, QOF_TYPE_KVP))
{ {
@ -1333,7 +1357,7 @@ gnc_scm2query_term_query_v1 (SCM query_term_scm)
{ {
gboolean case_sens; gboolean case_sens;
gboolean use_regexp; gboolean use_regexp;
const gchar *matchstring; gchar *matchstring;
/* case_sens */ /* case_sens */
if (scm_is_null (query_term_scm)) if (scm_is_null (query_term_scm))
@ -1357,6 +1381,7 @@ gnc_scm2query_term_query_v1 (SCM query_term_scm)
scm = SCM_CAR (query_term_scm); scm = SCM_CAR (query_term_scm);
query_term_scm = SCM_CDR (query_term_scm); query_term_scm = SCM_CDR (query_term_scm);
scm_dynwind_begin (0);
matchstring = scm_to_locale_string (scm); matchstring = scm_to_locale_string (scm);
if (!safe_strcmp (pr_type, "pr-action")) if (!safe_strcmp (pr_type, "pr-action"))
@ -1391,6 +1416,8 @@ gnc_scm2query_term_query_v1 (SCM query_term_scm)
{ {
PINFO ("Unknown string predicate: %s", pr_type); PINFO ("Unknown string predicate: %s", pr_type);
} }
scm_dynwind_free (matchstring);
scm_dynwind_end ();
} }
else if (!safe_strcmp (pd_type, "pd-cleared")) else if (!safe_strcmp (pd_type, "pd-cleared"))
@ -1430,6 +1457,7 @@ gnc_scm2query_term_query_v1 (SCM query_term_scm)
{ {
GncGUID guid; GncGUID guid;
QofIdType id_type; QofIdType id_type;
gchar *str;
/* guid */ /* guid */
if (scm_is_null (query_term_scm)) if (scm_is_null (query_term_scm))
@ -1442,9 +1470,14 @@ gnc_scm2query_term_query_v1 (SCM query_term_scm)
/* id type */ /* id type */
scm = SCM_CAR (query_term_scm); scm = SCM_CAR (query_term_scm);
query_term_scm = SCM_CDR (query_term_scm); query_term_scm = SCM_CDR (query_term_scm);
id_type = g_strdup (scm_to_locale_string (scm)); scm_dynwind_begin (0);
str = scm_to_locale_string (scm);
id_type = g_strdup (str);
scm_dynwind_free (str);
scm_dynwind_end ();
xaccQueryAddGUIDMatch (q, &guid, id_type, QOF_QUERY_OR); xaccQueryAddGUIDMatch (q, &guid, id_type, QOF_QUERY_OR);
g_free ((void *) id_type);
ok = TRUE; ok = TRUE;
} }