Changes from arch/CVS synchronization
authorLudovic Courtès <ludo@gnu.org>
Sat, 27 Oct 2007 17:41:35 +0000 (17:41 +0000)
committerLudovic Courtès <ludo@gnu.org>
Sat, 27 Oct 2007 17:41:35 +0000 (17:41 +0000)
ChangeLog
NEWS
libguile/ChangeLog
libguile/posix.c

index 2bc7288..c2ed0c0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2007-10-27  Ludovic Courtès  <ludo@gnu.org>
+
+       * NEWS: Mention `putenv' memory leak fix.
+
 2007-10-24  Neil Jerram  <neil@ossau.uklinux.net>
 
        * .cvsignore: Add "lib".
diff --git a/NEWS b/NEWS
index 6e8fe09..23029b0 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -43,6 +43,7 @@ Changes in 1.8.4 (since 1.8.3)
 ** CR (ASCII 0x0d) is (again) recognized as a token delimiter by the reader
 ** Fixed a segmentation fault which occurred when displaying the
 backtrace of a stack with a promise object (made by `delay') in it.
+** Fixed memory leak in `putenv'
 
 \f
 Changes in 1.8.3 (since 1.8.2)
index d59bc98..9d75986 100644 (file)
@@ -1,5 +1,7 @@
 2007-10-27  Ludovic Courtès  <ludo@gnu.org>
 
+       * posix.c (scm_putenv): Make sure C_STR gets freed.
+
        * fports.c (scm_i_evict_port): Expect a port, rather than a pair
        containing the port.  Fixes a bug in the new port table (2007-08-26).
        (scm_evict_ports): Use `scm_c_port_for_each ()'.
index 76dcd3d..5b09483 100644 (file)
@@ -1385,6 +1385,8 @@ SCM_DEFINE (scm_putenv, "putenv", 1, 0, 0,
 #else
       /* otherwise traditional putenv("NAME") */
       rv = putenv (c_str);
+      free (c_str);
+
       if (rv < 0)
        SCM_SYSERROR;
 #endif
@@ -1406,7 +1408,9 @@ SCM_DEFINE (scm_putenv, "putenv", 1, 0, 0,
             char *ptr = scm_malloc (len+2);
             strcpy (ptr, c_str);
             strcpy (ptr+len, " ");
+
             rv = putenv (ptr);
+           free (ptr);
             if (rv < 0)
               {
                 int eno = errno;
@@ -1419,6 +1423,8 @@ SCM_DEFINE (scm_putenv, "putenv", 1, 0, 0,
             ptr = getenv (c_str);
             if (ptr)
               ptr[0] = '\0';
+           free (c_str);
+
             return SCM_UNSPECIFIED;
           }
       }
@@ -1427,6 +1433,8 @@ SCM_DEFINE (scm_putenv, "putenv", 1, 0, 0,
       /* Leave c_str in the environment.  */
 
       rv = putenv (c_str);
+      free (c_str);
+
       if (rv < 0)
        SCM_SYSERROR;
     }