diff options
author | Bram Moolenaar <Bram@vim.org> | 2019-07-13 13:03:02 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2019-07-13 13:03:02 +0200 |
commit | 7b73f914c4fc5a3f7ad97b678cc8137f964e3d62 (patch) | |
tree | 241abb8cf378c3157fd818d1c7bd71a91604a345 /src/change.c | |
parent | 4e63f9425e6623aec4cd016af6def0b354b935f1 (diff) | |
download | vim-git-7b73f914c4fc5a3f7ad97b678cc8137f964e3d62.tar.gz |
patch 8.1.1675: listener list not correctly updated on listener_remove()v8.1.1675
Problem: Listener list not correctly updated on listener_remove().
Solution: Only set "prev" when not removing a listener. Return one if the
listener was found and removed.
Diffstat (limited to 'src/change.c')
-rw-r--r-- | src/change.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/src/change.c b/src/change.c index b928786eb..761e764f8 100644 --- a/src/change.c +++ b/src/change.c @@ -325,15 +325,17 @@ f_listener_flush(typval_T *argvars, typval_T *rettv UNUSED) * listener_remove() function */ void -f_listener_remove(typval_T *argvars, typval_T *rettv UNUSED) +f_listener_remove(typval_T *argvars, typval_T *rettv) { listener_T *lnr; listener_T *next; - listener_T *prev = NULL; + listener_T *prev; 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) { next = lnr->lr_next; @@ -345,9 +347,12 @@ f_listener_remove(typval_T *argvars, typval_T *rettv UNUSED) buf->b_listener = lnr->lr_next; free_callback(&lnr->lr_callback); vim_free(lnr); + rettv->vval.v_number = 1; + return; } prev = lnr; } + } } /* |