Mercurial > vim
changeset 17692:1e3ff1eae4c3 v8.1.1843
patch 8.1.1843: might be freeing memory that was not allocated
commit https://github.com/vim/vim/commit/f077db24230d10ef9a66ae14da34b639464d8fa2
Author: Bram Moolenaar <Bram@vim.org>
Date: Tue Aug 13 00:18:24 2019 +0200
patch 8.1.1843: might be freeing memory that was not allocated
Problem: Might be freeing memory that was not allocated.
Solution: Have next_fenc() set the fenc_alloced flag. (closes https://github.com/vim/vim/issues/4804)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Tue, 13 Aug 2019 00:30:05 +0200 |
parents | ebdea289ed6a |
children | cefb7da6a32c |
files | src/fileio.c src/version.c |
diffstat | 2 files changed, 14 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/src/fileio.c +++ b/src/fileio.c @@ -27,7 +27,7 @@ /* Is there any system that doesn't have access()? */ #define USE_MCH_ACCESS -static char_u *next_fenc(char_u **pp); +static char_u *next_fenc(char_u **pp, int *alloced); #ifdef FEAT_EVAL static char_u *readfile_charconvert(char_u *fname, char_u *fenc, int *fdp); #endif @@ -890,8 +890,7 @@ readfile( else { fenc_next = p_fencs; /* try items in 'fileencodings' */ - fenc = next_fenc(&fenc_next); - fenc_alloced = TRUE; + fenc = next_fenc(&fenc_next, &fenc_alloced); } /* @@ -994,8 +993,7 @@ retry: vim_free(fenc); if (fenc_next != NULL) { - fenc = next_fenc(&fenc_next); - fenc_alloced = (fenc_next != NULL); + fenc = next_fenc(&fenc_next, &fenc_alloced); } else { @@ -2761,14 +2759,16 @@ set_forced_fenc(exarg_T *eap) * "pp" points to fenc_next. It's advanced to the next item. * When there are no more items, an empty string is returned and *pp is set to * NULL. - * When *pp is not set to NULL, the result is in allocated memory. + * When *pp is not set to NULL, the result is in allocated memory and "alloced" + * is set to TRUE. */ static char_u * -next_fenc(char_u **pp) +next_fenc(char_u **pp, int *alloced) { char_u *p; char_u *r; + *alloced = FALSE; if (**pp == NUL) { *pp = NULL; @@ -2791,8 +2791,11 @@ next_fenc(char_u **pp) r = p; } } - if (r == NULL) /* out of memory */ - { + if (r != NULL) + *alloced = TRUE; + else + { + // out of memory r = (char_u *)""; *pp = NULL; }