diff --git a/src/app-utils/guile-util.c b/src/app-utils/guile-util.c index 2fcddbc62f..605a582700 100644 --- a/src/app-utils/guile-util.c +++ b/src/app-utils/guile-util.c @@ -1322,11 +1322,14 @@ gnc_parse_time_to_timet(const gchar *s, const gchar *format) gchar *gnc_scm_to_locale_string(SCM scm_string) { gchar* s; - char* x = scm_to_locale_string(scm_string); + char * str; - /* scm_to_locale_string() returns a malloc'ed string in guile-1.8 - (but not in guile-1.6). Copy to a g_malloc'ed one. */ - s = g_strdup(x); - free(x); + scm_dynwind_begin (0); + str = scm_to_locale_string(scm_string); + + /* prevent memory leaks in scm_to_locale_string() per guile manual; see 'http://www.gnu.org/software/guile/manual/html_node/Dynamic-Wind.html#Dynamic-Wind' */ + s = g_strdup(str); + scm_dynwind_free (str); + scm_dynwind_end (); return s; } diff --git a/src/app-utils/test/test-scm-query-string.c b/src/app-utils/test/test-scm-query-string.c index b3857e747b..d8a599598c 100644 --- a/src/app-utils/test/test-scm-query-string.c +++ b/src/app-utils/test/test-scm-query-string.c @@ -20,7 +20,7 @@ test_query (Query *q, SCM val2str) SCM res_q; SCM args = SCM_EOL; Query *q2; - const gchar * str; + char * str; gchar *str2 = NULL; scm_q = gnc_query2scm (q); @@ -30,8 +30,11 @@ test_query (Query *q, SCM val2str) args = scm_cons (scm_makfrom0str ("'"), scm_cons (str_q, SCM_EOL)); str_q = scm_string_append (args); + scm_dynwind_begin (0); str = scm_to_locale_string (str_q); if (str) str2 = g_strdup(str); + scm_dynwind_free (str); + scm_dynwind_end (); if (str2) { res_q = scm_c_eval_string (str2);