mirror of
https://github.com/vim/vim.git
synced 2025-07-26 11:04:33 -04:00
patch 8.2.0240: using memory after it was freed
Problem: Using memory after it was freed. (Dominique Pelle) Solution: Do not mix converion buffer with other buffer.
This commit is contained in:
parent
355757aed6
commit
408030e8d0
@ -742,6 +742,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
240,
|
||||||
/**/
|
/**/
|
||||||
239,
|
239,
|
||||||
/**/
|
/**/
|
||||||
|
14
src/vim.h
14
src/vim.h
@ -1129,20 +1129,6 @@ extern int (*dyn_libintl_wputenv)(const wchar_t *envstring);
|
|||||||
#define VIMINFO_VERSION_WITH_REGISTERS 3
|
#define VIMINFO_VERSION_WITH_REGISTERS 3
|
||||||
#define VIMINFO_VERSION_WITH_MARKS 4
|
#define VIMINFO_VERSION_WITH_MARKS 4
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
BVAL_NR,
|
|
||||||
BVAL_STRING,
|
|
||||||
BVAL_EMPTY
|
|
||||||
} btype_T;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
btype_T bv_type;
|
|
||||||
long bv_nr;
|
|
||||||
char_u *bv_string;
|
|
||||||
int bv_len; // length of bv_string
|
|
||||||
int bv_allocated; // bv_string was allocated
|
|
||||||
} bval_T;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Values for do_tag().
|
* Values for do_tag().
|
||||||
*/
|
*/
|
||||||
|
@ -26,6 +26,21 @@ typedef struct
|
|||||||
garray_T vir_barlines; // lines starting with |
|
garray_T vir_barlines; // lines starting with |
|
||||||
} vir_T;
|
} vir_T;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
BVAL_NR,
|
||||||
|
BVAL_STRING,
|
||||||
|
BVAL_EMPTY
|
||||||
|
} btype_T;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
btype_T bv_type;
|
||||||
|
long bv_nr;
|
||||||
|
char_u *bv_string;
|
||||||
|
char_u *bv_tofree; // free later when not NULL
|
||||||
|
int bv_len; // length of bv_string
|
||||||
|
int bv_allocated; // bv_string was allocated
|
||||||
|
} bval_T;
|
||||||
|
|
||||||
#if defined(FEAT_VIMINFO) || defined(PROTO)
|
#if defined(FEAT_VIMINFO) || defined(PROTO)
|
||||||
|
|
||||||
static int viminfo_errcnt;
|
static int viminfo_errcnt;
|
||||||
@ -1087,22 +1102,24 @@ barline_parse(vir_T *virp, char_u *text, garray_T *values)
|
|||||||
s[len] = NUL;
|
s[len] = NUL;
|
||||||
|
|
||||||
converted = FALSE;
|
converted = FALSE;
|
||||||
|
value->bv_tofree = NULL;
|
||||||
if (virp->vir_conv.vc_type != CONV_NONE && *s != NUL)
|
if (virp->vir_conv.vc_type != CONV_NONE && *s != NUL)
|
||||||
{
|
{
|
||||||
sconv = string_convert(&virp->vir_conv, s, NULL);
|
sconv = string_convert(&virp->vir_conv, s, NULL);
|
||||||
if (sconv != NULL)
|
if (sconv != NULL)
|
||||||
{
|
{
|
||||||
if (s == buf)
|
if (s == buf)
|
||||||
vim_free(s);
|
// the converted string is stored in bv_string and
|
||||||
|
// freed later, also need to free "buf" later
|
||||||
|
value->bv_tofree = buf;
|
||||||
s = sconv;
|
s = sconv;
|
||||||
buf = s;
|
|
||||||
converted = TRUE;
|
converted = TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Need to copy in allocated memory if the string wasn't allocated
|
// Need to copy in allocated memory if the string wasn't allocated
|
||||||
// above and we did allocate before, thus vir_line may change.
|
// above and we did allocate before, thus vir_line may change.
|
||||||
if (s != buf && allocated)
|
if (s != buf && allocated && !converted)
|
||||||
s = vim_strsave(s);
|
s = vim_strsave(s);
|
||||||
value->bv_string = s;
|
value->bv_string = s;
|
||||||
value->bv_type = BVAL_STRING;
|
value->bv_type = BVAL_STRING;
|
||||||
@ -2747,6 +2764,7 @@ read_viminfo_barline(vir_T *virp, int got_encoding, int force, int writing)
|
|||||||
vp = (bval_T *)values.ga_data + i;
|
vp = (bval_T *)values.ga_data + i;
|
||||||
if (vp->bv_type == BVAL_STRING && vp->bv_allocated)
|
if (vp->bv_type == BVAL_STRING && vp->bv_allocated)
|
||||||
vim_free(vp->bv_string);
|
vim_free(vp->bv_string);
|
||||||
|
vim_free(vp->bv_tofree);
|
||||||
}
|
}
|
||||||
ga_clear(&values);
|
ga_clear(&values);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user