To: vim_dev@googlegroups.com Subject: Patch 8.1.2107 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.1.2107 Problem: Various memory leaks reported by asan. Solution: Free the memory. (Ozaki Kiichi, closes #5003) Files: src/buffer.c, src/change.c, src/eval.c, src/evalfunc.c, src/option.c, src/popupwin.c, src/proto/change.pro, src/scriptfile.c, src/terminal.c, src/testdir/test_method.vim *** ../vim-8.1.2106/src/buffer.c 2019-09-28 19:04:06.989029610 +0200 --- src/buffer.c 2019-10-01 16:43:06.399984907 +0200 *************** *** 880,885 **** --- 880,886 ---- /* b:changedtick uses an item in buf_T, remove it now */ dictitem_remove(buf->b_vars, (dictitem_T *)&buf->b_ct_di); unref_var_dict(buf->b_vars); + remove_listeners(buf); #endif #ifdef FEAT_LUA lua_buffer_free(buf); *************** *** 908,913 **** --- 909,915 ---- #ifdef FEAT_JOB_CHANNEL vim_free(buf->b_prompt_text); free_callback(&buf->b_prompt_callback); + free_callback(&buf->b_prompt_interrupt); #endif buf_hashtab_remove(buf); *** ../vim-8.1.2106/src/change.c 2019-09-28 19:04:06.989029610 +0200 --- src/change.c 2019-10-01 16:43:06.399984907 +0200 *************** *** 300,306 **** int id = tv_get_number(argvars); buf_T *buf; ! for (buf = firstbuf; buf != NULL; buf = buf->b_next) { prev = NULL; for (lnr = buf->b_listener; lnr != NULL; lnr = next) --- 300,306 ---- int id = tv_get_number(argvars); buf_T *buf; ! FOR_ALL_BUFFERS(buf) { prev = NULL; for (lnr = buf->b_listener; lnr != NULL; lnr = next) *************** *** 402,407 **** --- 402,425 ---- after_updating_screen(TRUE); recursive = FALSE; } + + /* + * Remove all listeners associated with "buf". + */ + void + remove_listeners(buf_T *buf) + { + listener_T *lnr; + listener_T *next; + + for (lnr = buf->b_listener; lnr != NULL; lnr = next) + { + next = lnr->lr_next; + free_callback(&lnr->lr_callback); + vim_free(lnr); + } + buf->b_listener = NULL; + } #endif /* *** ../vim-8.1.2106/src/eval.c 2019-09-15 14:32:49.556731456 +0200 --- src/eval.c 2019-10-01 16:43:06.399984907 +0200 *************** *** 2914,2922 **** semsg(_(e_missingparen), "lambda"); } clear_tv(rettv); ! return FAIL; } ! return call_func_rettv(arg, rettv, evaluate, NULL, &base); } /* --- 2914,2930 ---- semsg(_(e_missingparen), "lambda"); } clear_tv(rettv); ! ret = FAIL; } ! else ! ret = call_func_rettv(arg, rettv, evaluate, NULL, &base); ! ! // Clear the funcref afterwards, so that deleting it while ! // evaluating the arguments is possible (see test55). ! if (evaluate) ! clear_tv(&base); ! ! return ret; } /* *** ../vim-8.1.2106/src/evalfunc.c 2019-09-28 19:04:06.989029610 +0200 --- src/evalfunc.c 2019-10-01 16:43:06.403984886 +0200 *************** *** 2213,2220 **** { if (rettv_list_alloc(rettv) != FAIL && result != NULL) list_append_string(rettv->vval.v_list, result, -1); ! else ! vim_free(result); } else rettv->vval.v_string = result; --- 2213,2219 ---- { if (rettv_list_alloc(rettv) != FAIL && result != NULL) list_append_string(rettv->vval.v_list, result, -1); ! vim_free(result); } else rettv->vval.v_string = result; *** ../vim-8.1.2106/src/option.c 2019-09-28 19:04:06.997029566 +0200 --- src/option.c 2019-10-01 16:43:06.403984886 +0200 *************** *** 686,692 **** && (do_buffer || (p->indir & PV_BUF) == 0) && !(options[i].flags & P_NODEFAULT) && !optval_default(p, varp, FALSE)) ! set_option_default(i, OPT_LOCAL, FALSE); } unblock_autocmds(); --- 686,692 ---- && (do_buffer || (p->indir & PV_BUF) == 0) && !(options[i].flags & P_NODEFAULT) && !optval_default(p, varp, FALSE)) ! set_option_default(i, OPT_FREE|OPT_LOCAL, FALSE); } unblock_autocmds(); *** ../vim-8.1.2106/src/popupwin.c 2019-09-25 22:45:31.721534846 +0200 --- src/popupwin.c 2019-10-01 16:43:06.403984886 +0200 *************** *** 3365,3370 **** --- 3365,3371 ---- trunc_string(wp->w_popup_title, title, total_width - 2, len); screen_puts(title, wp->w_winrow, wp->w_wincol + 1, wp->w_popup_border[0] > 0 ? border_attr[0] : popup_attr); + vim_free(title); } // Compute scrollbar thumb position and size. *** ../vim-8.1.2106/src/proto/change.pro 2019-08-20 20:13:40.330821936 +0200 --- src/proto/change.pro 2019-10-01 16:50:02.409889501 +0200 *************** *** 7,12 **** --- 7,13 ---- void f_listener_remove(typval_T *argvars, typval_T *rettv); void may_invoke_listeners(buf_T *buf, linenr_T lnum, linenr_T lnume, int added); void invoke_listeners(buf_T *buf); + void remove_listeners(buf_T *buf); void changed_bytes(linenr_T lnum, colnr_T col); void appended_lines(linenr_T lnum, long count); void appended_lines_mark(linenr_T lnum, long count); *** ../vim-8.1.2106/src/scriptfile.c 2019-09-15 14:32:49.556731456 +0200 --- src/scriptfile.c 2019-10-01 16:43:06.403984886 +0200 *************** *** 1358,1364 **** --- 1358,1367 ---- int i; for (i = script_items.ga_len; i > 0; --i) + { vim_free(SCRIPT_ITEM(i).sn_name); + ga_clear(&SCRIPT_ITEM(i).sn_prl_ga); + } ga_clear(&script_items); } *** ../vim-8.1.2106/src/terminal.c 2019-09-26 23:08:10.505926873 +0200 --- src/terminal.c 2019-10-01 16:43:06.403984886 +0200 *************** *** 4602,4607 **** --- 4602,4608 ---- } ga_clear(&ga_text); + ga_clear(&ga_cell); vim_free(prev_char); return max_cells; *************** *** 4733,4739 **** buf = curbuf; while (!(curbuf->b_ml.ml_flags & ML_EMPTY)) ml_delete((linenr_T)1, FALSE); ! ga_clear(&curbuf->b_term->tl_scrollback); redraw_later(NOT_VALID); } } --- 4734,4740 ---- buf = curbuf; while (!(curbuf->b_ml.ml_flags & ML_EMPTY)) ml_delete((linenr_T)1, FALSE); ! free_scrollback(curbuf->b_term); redraw_later(NOT_VALID); } } *** ../vim-8.1.2106/src/testdir/test_method.vim 2019-08-23 22:31:33.217176868 +0200 --- src/testdir/test_method.vim 2019-10-01 16:43:06.403984886 +0200 *************** *** 140,145 **** --- 140,149 ---- " todo: lambda accepts more arguments than it consumes " call assert_fails('eval "text"->{x -> x .. " extended"}("more")', 'E99:') + + let l = [1, 2, 3] + eval l->{x -> x}() + call assert_equal(1, test_refcount(l)) endfunc func Test_method_not_supported() *** ../vim-8.1.2106/src/version.c 2019-10-01 14:19:04.105173130 +0200 --- src/version.c 2019-10-01 16:46:38.242905800 +0200 *************** *** 755,756 **** --- 755,758 ---- { /* Add new patch number below this line */ + /**/ + 2107, /**/ -- The early bird gets the worm. The second mouse gets the cheese. /// 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 ///