]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix unlikely substitute-command-keys memory leak
authorPaul Eggert <eggert@cs.ucla.edu>
Thu, 8 Dec 2016 18:43:11 +0000 (10:43 -0800)
committerPaul Eggert <eggert@cs.ucla.edu>
Thu, 8 Dec 2016 18:43:58 +0000 (10:43 -0800)
* src/doc.c (Fsubstitute_command_keys):
Free buffer when unwinding.

src/doc.c

index ce4f89b94ddbedb8633f6c61a412ec175dcf0b97..6a78ed657c1e484ec3a5013a32b016fcada5aa79 100644 (file)
--- a/src/doc.c
+++ b/src/doc.c
@@ -772,6 +772,8 @@ Otherwise, return a new string.  */)
   /* Extra room for expansion due to replacing ‘\[]’ with ‘M-x ’.  */
   enum { EXTRA_ROOM = sizeof "M-x " - sizeof "\\[]" };
 
+  ptrdiff_t count = SPECPDL_INDEX ();
+
   if (bsize <= sizeof sbuf - EXTRA_ROOM)
     {
       abuf = NULL;
@@ -779,7 +781,10 @@ Otherwise, return a new string.  */)
       bsize = sizeof sbuf;
     }
   else
-    buf = abuf = xpalloc (NULL, &bsize, EXTRA_ROOM, STRING_BYTES_BOUND, 1);
+    {
+      buf = abuf = xpalloc (NULL, &bsize, EXTRA_ROOM, STRING_BYTES_BOUND, 1);
+      record_unwind_protect_ptr (xfree, abuf);
+    }
   bufp = buf;
 
   strp = SDATA (str);
@@ -929,7 +934,12 @@ Otherwise, return a new string.  */)
                abuf = xpalloc (abuf, &bsize, need - avail,
                                STRING_BYTES_BOUND, 1);
                if (buf == sbuf)
-                 memcpy (abuf, sbuf, offset);
+                 {
+                   record_unwind_protect_ptr (xfree, abuf);
+                   memcpy (abuf, sbuf, offset);
+                 }
+               else
+                 set_unwind_protect_ptr (count, xfree, abuf);
                buf = abuf;
                bufp = buf + offset;
              }
@@ -988,8 +998,7 @@ Otherwise, return a new string.  */)
     }
   else
     tem = string;
-  xfree (abuf);
-  return tem;
+  return unbind_to (count, tem);
 }
 \f
 void