]> granicus.if.org Git - vim/commitdiff
patch 8.1.0642: swapinfo() leaks memory v8.1.0642
authorBram Moolenaar <Bram@vim.org>
Wed, 26 Dec 2018 21:57:42 +0000 (22:57 +0100)
committerBram Moolenaar <Bram@vim.org>
Wed, 26 Dec 2018 21:57:42 +0000 (22:57 +0100)
Problem:    swapinfo() leaks memory.
Solution:   Avoid allocating the strings twice.

src/dict.c
src/memline.c
src/proto/dict.pro
src/version.c

index 34ba3e0e41b83b77e6e8680a7fac313d5f01e064..9b85900278a5de14b37fe249eec2cdf245576cc5 100644 (file)
@@ -369,14 +369,34 @@ dict_add_number(dict_T *d, char *key, varnumber_T nr)
  */
     int
 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;
+    char_u     *val = NULL;
 
     item = dictitem_alloc((char_u *)key);
     if (item == NULL)
        return FAIL;
     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)
     {
        dictitem_free(item);
index 9f082660a5c7393d5291743a933393f45e4ccd0d..d79e7ce8c08efa39fcbc5be3285d22f8afae2fa3 100644 (file)
@@ -2055,21 +2055,16 @@ get_b0_dict(char_u *fname, dict_T *d)
        if (read_eintr(fd, &b0, sizeof(b0)) == sizeof(b0))
        {
            if (ml_check_b0_id(&b0) == FAIL)
-               dict_add_string(d, "error",
-                              vim_strsave((char_u *)"Not a swap file"));
+               dict_add_string(d, "error", (char_u *)"Not a swap file");
            else if (b0_magic_wrong(&b0))
-               dict_add_string(d, "error",
-                              vim_strsave((char_u *)"Magic number mismatch"));
+               dict_add_string(d, "error", (char_u *)"Magic number mismatch");
            else
            {
                /* we have swap information */
-               dict_add_string(d, "version", vim_strnsave(b0.b0_version, 10));
-               dict_add_string(d, "user",
-                                    vim_strnsave(b0.b0_uname, B0_UNAME_SIZE));
-               dict_add_string(d, "host",
-                                    vim_strnsave(b0.b0_hname, B0_HNAME_SIZE));
-               dict_add_string(d, "fname",
-                                vim_strnsave(b0.b0_fname, B0_FNAME_SIZE_ORG));
+               dict_add_string_len(d, "version", b0.b0_version, 10);
+               dict_add_string_len(d, "user", b0.b0_uname, B0_UNAME_SIZE);
+               dict_add_string_len(d, "host", b0.b0_hname, B0_HNAME_SIZE);
+               dict_add_string_len(d, "fname", b0.b0_fname, B0_FNAME_SIZE_ORG);
 
                dict_add_number(d, "pid", char_to_long(b0.b0_pid));
                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
-           dict_add_string(d, "error",
-                                   vim_strsave((char_u *)"Cannot read file"));
+           dict_add_string(d, "error", (char_u *)"Cannot read file");
        close(fd);
     }
     else
-       dict_add_string(d, "error", vim_strsave((char_u *)"Cannot open file"));
+       dict_add_string(d, "error", (char_u *)"Cannot open file");
 }
 #endif
 
index 94ed2a08557e7bb26e0fe5b74ab70c6458cc452a..b09a647bd4e05fa7b9a66c0f6b369022484e2de2 100644 (file)
@@ -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_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_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_dict(dict_T *d, char *key, dict_T *dict);
 long dict_len(dict_T *d);
index 3150da92f50faf1bee372d7793abf6dedfc7f9cf..dc1135827dedb1584c58d0115b3dbc064780d751 100644 (file)
@@ -799,6 +799,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    642,
 /**/
     641,
 /**/