diff options
| author | Paul Eggert | 2016-12-08 10:43:11 -0800 |
|---|---|---|
| committer | Paul Eggert | 2016-12-08 10:43:58 -0800 |
| commit | 162ba405ac144c2a0cb6854f791ff7d3203b0e2f (patch) | |
| tree | d0980d15280591b5d8a4dc5d72cda7e55fbfe05d | |
| parent | c685e4c92909b2ae0140953417e0d856eb34ba33 (diff) | |
| download | emacs-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.c | 17 |
1 files changed, 13 insertions, 4 deletions
| @@ -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 | ||
| 995 | void | 1004 | void |