mirror of
https://github.com/vim/vim.git
synced 2025-10-02 05:04:20 -04:00
patch 8.1.0642: swapinfo() leaks memory
Problem: swapinfo() leaks memory. Solution: Avoid allocating the strings twice.
This commit is contained in:
22
src/dict.c
22
src/dict.c
@@ -369,14 +369,34 @@ dict_add_number(dict_T *d, char *key, varnumber_T nr)
|
|||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
dict_add_string(dict_T *d, char *key, char_u *str)
|
dict_add_string(dict_T *d, char *key, char_u *str)
|
||||||
|
{
|
||||||
|
return dict_add_string_len(d, key, str, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Add a string entry to dictionary "d".
|
||||||
|
* "str" will be copied to allocated memory.
|
||||||
|
* When "len" is -1 use the whole string, otherwise only this many bytes.
|
||||||
|
* Returns FAIL when out of memory and when key already exists.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
dict_add_string_len(dict_T *d, char *key, char_u *str, int len)
|
||||||
{
|
{
|
||||||
dictitem_T *item;
|
dictitem_T *item;
|
||||||
|
char_u *val = NULL;
|
||||||
|
|
||||||
item = dictitem_alloc((char_u *)key);
|
item = dictitem_alloc((char_u *)key);
|
||||||
if (item == NULL)
|
if (item == NULL)
|
||||||
return FAIL;
|
return FAIL;
|
||||||
item->di_tv.v_type = VAR_STRING;
|
item->di_tv.v_type = VAR_STRING;
|
||||||
item->di_tv.vval.v_string = str != NULL ? vim_strsave(str) : NULL;
|
if (str != NULL)
|
||||||
|
{
|
||||||
|
if (len == -1)
|
||||||
|
val = vim_strsave(str);
|
||||||
|
else
|
||||||
|
val = vim_strnsave(str, len);
|
||||||
|
}
|
||||||
|
item->di_tv.vval.v_string = val;
|
||||||
if (dict_add(d, item) == FAIL)
|
if (dict_add(d, item) == FAIL)
|
||||||
{
|
{
|
||||||
dictitem_free(item);
|
dictitem_free(item);
|
||||||
|
@@ -2055,21 +2055,16 @@ get_b0_dict(char_u *fname, dict_T *d)
|
|||||||
if (read_eintr(fd, &b0, sizeof(b0)) == sizeof(b0))
|
if (read_eintr(fd, &b0, sizeof(b0)) == sizeof(b0))
|
||||||
{
|
{
|
||||||
if (ml_check_b0_id(&b0) == FAIL)
|
if (ml_check_b0_id(&b0) == FAIL)
|
||||||
dict_add_string(d, "error",
|
dict_add_string(d, "error", (char_u *)"Not a swap file");
|
||||||
vim_strsave((char_u *)"Not a swap file"));
|
|
||||||
else if (b0_magic_wrong(&b0))
|
else if (b0_magic_wrong(&b0))
|
||||||
dict_add_string(d, "error",
|
dict_add_string(d, "error", (char_u *)"Magic number mismatch");
|
||||||
vim_strsave((char_u *)"Magic number mismatch"));
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* we have swap information */
|
/* we have swap information */
|
||||||
dict_add_string(d, "version", vim_strnsave(b0.b0_version, 10));
|
dict_add_string_len(d, "version", b0.b0_version, 10);
|
||||||
dict_add_string(d, "user",
|
dict_add_string_len(d, "user", b0.b0_uname, B0_UNAME_SIZE);
|
||||||
vim_strnsave(b0.b0_uname, B0_UNAME_SIZE));
|
dict_add_string_len(d, "host", b0.b0_hname, B0_HNAME_SIZE);
|
||||||
dict_add_string(d, "host",
|
dict_add_string_len(d, "fname", b0.b0_fname, B0_FNAME_SIZE_ORG);
|
||||||
vim_strnsave(b0.b0_hname, B0_HNAME_SIZE));
|
|
||||||
dict_add_string(d, "fname",
|
|
||||||
vim_strnsave(b0.b0_fname, B0_FNAME_SIZE_ORG));
|
|
||||||
|
|
||||||
dict_add_number(d, "pid", char_to_long(b0.b0_pid));
|
dict_add_number(d, "pid", char_to_long(b0.b0_pid));
|
||||||
dict_add_number(d, "mtime", char_to_long(b0.b0_mtime));
|
dict_add_number(d, "mtime", char_to_long(b0.b0_mtime));
|
||||||
@@ -2080,12 +2075,11 @@ get_b0_dict(char_u *fname, dict_T *d)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
dict_add_string(d, "error",
|
dict_add_string(d, "error", (char_u *)"Cannot read file");
|
||||||
vim_strsave((char_u *)"Cannot read file"));
|
|
||||||
close(fd);
|
close(fd);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
dict_add_string(d, "error", vim_strsave((char_u *)"Cannot open file"));
|
dict_add_string(d, "error", (char_u *)"Cannot open file");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@@ -15,6 +15,7 @@ dict_T *dict_copy(dict_T *orig, int deep, int copyID);
|
|||||||
int dict_add(dict_T *d, dictitem_T *item);
|
int dict_add(dict_T *d, dictitem_T *item);
|
||||||
int dict_add_number(dict_T *d, char *key, varnumber_T nr);
|
int dict_add_number(dict_T *d, char *key, varnumber_T nr);
|
||||||
int dict_add_string(dict_T *d, char *key, char_u *str);
|
int dict_add_string(dict_T *d, char *key, char_u *str);
|
||||||
|
int dict_add_string_len(dict_T *d, char *key, char_u *str, int len);
|
||||||
int dict_add_list(dict_T *d, char *key, list_T *list);
|
int dict_add_list(dict_T *d, char *key, list_T *list);
|
||||||
int dict_add_dict(dict_T *d, char *key, dict_T *dict);
|
int dict_add_dict(dict_T *d, char *key, dict_T *dict);
|
||||||
long dict_len(dict_T *d);
|
long dict_len(dict_T *d);
|
||||||
|
@@ -799,6 +799,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 */
|
||||||
|
/**/
|
||||||
|
642,
|
||||||
/**/
|
/**/
|
||||||
641,
|
641,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user