To: vim_dev@googlegroups.com Subject: Patch 8.1.0642 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.1.0642 Problem: swapinfo() leaks memory. (Christian Brabandt) Solution: Avoid allocating the strings twice. Files: src/memline.c, src/dict.c, src/proto/dict.pro *** ../vim-8.1.0641/src/memline.c 2018-12-25 23:15:41.795966567 +0100 --- src/memline.c 2018-12-26 22:51:14.081259880 +0100 *************** *** 2055,2075 **** 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")); else if (b0_magic_wrong(&b0)) ! dict_add_string(d, "error", ! vim_strsave((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_number(d, "pid", char_to_long(b0.b0_pid)); dict_add_number(d, "mtime", char_to_long(b0.b0_mtime)); --- 2055,2070 ---- if (read_eintr(fd, &b0, sizeof(b0)) == sizeof(b0)) { if (ml_check_b0_id(&b0) == FAIL) ! dict_add_string(d, "error", (char_u *)"Not a swap file"); else if (b0_magic_wrong(&b0)) ! dict_add_string(d, "error", (char_u *)"Magic number mismatch"); else { /* we have swap information */ ! 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,2091 **** } } else ! dict_add_string(d, "error", ! vim_strsave((char_u *)"Cannot read file")); close(fd); } else ! dict_add_string(d, "error", vim_strsave((char_u *)"Cannot open file")); } #endif --- 2075,2085 ---- } } else ! dict_add_string(d, "error", (char_u *)"Cannot read file"); close(fd); } else ! dict_add_string(d, "error", (char_u *)"Cannot open file"); } #endif *** ../vim-8.1.0641/src/dict.c 2018-12-21 16:04:16.312437516 +0100 --- src/dict.c 2018-12-26 22:46:22.175314033 +0100 *************** *** 370,382 **** int dict_add_string(dict_T *d, char *key, char_u *str) { dictitem_T *item; 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 (dict_add(d, item) == FAIL) { dictitem_free(item); --- 370,402 ---- 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; ! 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); *** ../vim-8.1.0641/src/proto/dict.pro 2018-12-14 15:38:28.323597695 +0100 --- src/proto/dict.pro 2018-12-26 22:46:26.863281096 +0100 *************** *** 15,20 **** --- 15,21 ---- 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); *** ../vim-8.1.0641/src/version.c 2018-12-26 22:04:35.494546386 +0100 --- src/version.c 2018-12-26 22:56:06.859194439 +0100 *************** *** 801,802 **** --- 801,804 ---- { /* Add new patch number below this line */ + /**/ + 642, /**/ -- "I simultaneously try to keep my head in the clouds and my feet on the ground. Sometimes it's a stretch, though." -- Larry Wall /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///