vim-patch:8.1.0642: swapinfo() leaks memory

Problem:    swapinfo() leaks memory.
Solution:   Avoid allocating the strings twice.
e6fdf79980
This commit is contained in:
Justin M. Keyes
2019-04-29 22:05:45 +02:00
parent a01246c275
commit aac731c22b
2 changed files with 33 additions and 18 deletions

View File

@@ -1656,12 +1656,7 @@ int tv_dict_add_special(dict_T *const d, const char *const key,
/// Add a string entry to dictionary /// Add a string entry to dictionary
/// ///
/// @param[out] d Dictionary to add entry to. /// @see tv_dict_add_allocated_str
/// @param[in] key Key to add.
/// @param[in] key_len Key length.
/// @param[in] val String to add.
///
/// @return OK in case of success, FAIL when key already exists.
int tv_dict_add_str(dict_T *const d, int tv_dict_add_str(dict_T *const d,
const char *const key, const size_t key_len, const char *const key, const size_t key_len,
const char *const val) const char *const val)
@@ -1670,6 +1665,27 @@ int tv_dict_add_str(dict_T *const d,
return tv_dict_add_allocated_str(d, key, key_len, xstrdup(val)); return tv_dict_add_allocated_str(d, key, key_len, xstrdup(val));
} }
/// Add a string entry to dictionary
///
/// @param[out] d Dictionary to add entry to.
/// @param[in] key Key to add.
/// @param[in] key_len Key length.
/// @param[in] val String to add. NULL adds empty string.
/// @param[in] len Use this many bytes from `val`, or -1 for whole string.
///
/// @return OK in case of success, FAIL when key already exists.
int tv_dict_add_str_len(dict_T *const d,
const char *const key, const size_t key_len,
char *const val, int len)
FUNC_ATTR_NONNULL_ARG(1, 2)
{
char *s = val ? val : "";
if (val != NULL) {
s = (len < 0) ? xstrdup(val) : xstrndup(val, (size_t)len);
}
return tv_dict_add_allocated_str(d, key, key_len, s);
}
/// Add a string entry to dictionary /// Add a string entry to dictionary
/// ///
/// Unlike tv_dict_add_str() saves val to the new dictionary item in place of /// Unlike tv_dict_add_str() saves val to the new dictionary item in place of

View File

@@ -1466,19 +1466,18 @@ void get_b0_dict(const char *fname, dict_T *d)
if ((fd = os_open(fname, O_RDONLY, 0)) >= 0) { if ((fd = os_open(fname, O_RDONLY, 0)) >= 0) {
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) {
tv_dict_add_str(d, S_LEN("error"), xstrdup("Not a swap file")); tv_dict_add_str(d, S_LEN("error"), "Not a swap file");
} else if (b0_magic_wrong(&b0)) { } else if (b0_magic_wrong(&b0)) {
tv_dict_add_str(d, S_LEN("error"), xstrdup("Magic number mismatch")); tv_dict_add_str(d, S_LEN("error"), "Magic number mismatch");
} else { } else {
// We have swap information. // We have swap information.
tv_dict_add_str(d, S_LEN("version"), tv_dict_add_str_len(d, S_LEN("version"), (char *)b0.b0_version, 10);
xstrndup((char *)b0.b0_version, 10)); tv_dict_add_str_len(d, S_LEN("user"), (char *)b0.b0_uname,
tv_dict_add_str(d, S_LEN("user"), B0_UNAME_SIZE);
xstrndup((char *)b0.b0_uname, B0_UNAME_SIZE)); tv_dict_add_str_len(d, S_LEN("host"), (char *)b0.b0_hname,
tv_dict_add_str(d, S_LEN("host"), B0_HNAME_SIZE);
xstrndup((char *)b0.b0_hname, B0_HNAME_SIZE)); tv_dict_add_str_len(d, S_LEN("fname"), (char *)b0.b0_fname,
tv_dict_add_str(d, S_LEN("fname"), B0_FNAME_SIZE_ORG);
xstrndup((char *)b0.b0_fname, B0_FNAME_SIZE_ORG));
tv_dict_add_nr(d, S_LEN("pid"), char_to_long(b0.b0_pid)); tv_dict_add_nr(d, S_LEN("pid"), char_to_long(b0.b0_pid));
tv_dict_add_nr(d, S_LEN("mtime"), char_to_long(b0.b0_mtime)); tv_dict_add_nr(d, S_LEN("mtime"), char_to_long(b0.b0_mtime));
@@ -1486,11 +1485,11 @@ void get_b0_dict(const char *fname, dict_T *d)
tv_dict_add_nr(d, S_LEN("inode"), char_to_long(b0.b0_ino)); tv_dict_add_nr(d, S_LEN("inode"), char_to_long(b0.b0_ino));
} }
} else { } else {
tv_dict_add_str(d, S_LEN("error"), xstrdup("Cannot read file")); tv_dict_add_str(d, S_LEN("error"), "Cannot read file");
} }
close(fd); close(fd);
} else { } else {
tv_dict_add_str(d, S_LEN("error"), xstrdup("Cannot open file")); tv_dict_add_str(d, S_LEN("error"), "Cannot open file");
} }
} }