r20744 - gnucash/trunk/src/app-utils - Correct memory handling of scm_to_locale_string per guile manual

J. Alex Aycinena alex.aycinena at code.gnucash.org
Thu Jun 9 18:40:54 EDT 2011


Author: alex.aycinena
Date: 2011-06-09 18:40:54 -0400 (Thu, 09 Jun 2011)
New Revision: 20744
Trac: http://svn.gnucash.org/trac/changeset/20744

Modified:
   gnucash/trunk/src/app-utils/guile-util.c
   gnucash/trunk/src/app-utils/test/test-scm-query-string.c
Log:
Correct memory handling of scm_to_locale_string per guile manual

Modified: gnucash/trunk/src/app-utils/guile-util.c
===================================================================
--- gnucash/trunk/src/app-utils/guile-util.c	2011-06-09 21:43:36 UTC (rev 20743)
+++ gnucash/trunk/src/app-utils/guile-util.c	2011-06-09 22:40:54 UTC (rev 20744)
@@ -1322,11 +1322,14 @@
 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;
 }

Modified: gnucash/trunk/src/app-utils/test/test-scm-query-string.c
===================================================================
--- gnucash/trunk/src/app-utils/test/test-scm-query-string.c	2011-06-09 21:43:36 UTC (rev 20743)
+++ gnucash/trunk/src/app-utils/test/test-scm-query-string.c	2011-06-09 22:40:54 UTC (rev 20744)
@@ -20,7 +20,7 @@
     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 @@
     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);



More information about the gnucash-changes mailing list