aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Eggert2016-12-08 10:43:11 -0800
committerPaul Eggert2016-12-08 10:43:58 -0800
commit162ba405ac144c2a0cb6854f791ff7d3203b0e2f (patch)
treed0980d15280591b5d8a4dc5d72cda7e55fbfe05d
parentc685e4c92909b2ae0140953417e0d856eb34ba33 (diff)
downloademacs-162ba405ac144c2a0cb6854f791ff7d3203b0e2f.tar.gz
emacs-162ba405ac144c2a0cb6854f791ff7d3203b0e2f.zip
Fix unlikely substitute-command-keys memory leak
* src/doc.c (Fsubstitute_command_keys): Free buffer when unwinding.
-rw-r--r--src/doc.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/src/doc.c b/src/doc.c
index ce4f89b94dd..6a78ed657c1 100644
--- a/src/doc.c
+++ b/src/doc.c
@@ -772,6 +772,8 @@ Otherwise, return a new string. */)
772 /* Extra room for expansion due to replacing ‘\[]’ with ‘M-x ’. */ 772 /* Extra room for expansion due to replacing ‘\[]’ with ‘M-x ’. */
773 enum { EXTRA_ROOM = sizeof "M-x " - sizeof "\\[]" }; 773 enum { EXTRA_ROOM = sizeof "M-x " - sizeof "\\[]" };
774 774
775 ptrdiff_t count = SPECPDL_INDEX ();
776
775 if (bsize <= sizeof sbuf - EXTRA_ROOM) 777 if (bsize <= sizeof sbuf - EXTRA_ROOM)
776 { 778 {
777 abuf = NULL; 779 abuf = NULL;
@@ -779,7 +781,10 @@ Otherwise, return a new string. */)
779 bsize = sizeof sbuf; 781 bsize = sizeof sbuf;
780 } 782 }
781 else 783 else
782 buf = abuf = xpalloc (NULL, &bsize, EXTRA_ROOM, STRING_BYTES_BOUND, 1); 784 {
785 buf = abuf = xpalloc (NULL, &bsize, EXTRA_ROOM, STRING_BYTES_BOUND, 1);
786 record_unwind_protect_ptr (xfree, abuf);
787 }
783 bufp = buf; 788 bufp = buf;
784 789
785 strp = SDATA (str); 790 strp = SDATA (str);
@@ -929,7 +934,12 @@ Otherwise, return a new string. */)
929 abuf = xpalloc (abuf, &bsize, need - avail, 934 abuf = xpalloc (abuf, &bsize, need - avail,
930 STRING_BYTES_BOUND, 1); 935 STRING_BYTES_BOUND, 1);
931 if (buf == sbuf) 936 if (buf == sbuf)
932 memcpy (abuf, sbuf, offset); 937 {
938 record_unwind_protect_ptr (xfree, abuf);
939 memcpy (abuf, sbuf, offset);
940 }
941 else
942 set_unwind_protect_ptr (count, xfree, abuf);
933 buf = abuf; 943 buf = abuf;
934 bufp = buf + offset; 944 bufp = buf + offset;
935 } 945 }
@@ -988,8 +998,7 @@ Otherwise, return a new string. */)
988 } 998 }
989 else 999 else
990 tem = string; 1000 tem = string;
991 xfree (abuf); 1001 return unbind_to (count, tem);
992 return tem;
993} 1002}
994 1003
995void 1004void