Mercurial > vim
diff src/channel.c @ 8404:8894d595b786 v7.4.1493
commit https://github.com/vim/vim/commit/5983ad0b038fa689653246cb304fd43e8ae39a78
Author: Bram Moolenaar <Bram@vim.org>
Date: Sat Mar 5 20:54:36 2016 +0100
patch 7.4.1493
Problem: Wrong callback invoked for zero-id messages.
Solution: Don't use the first one-time callback when the sequence number
doesn't match.
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Sat, 05 Mar 2016 21:00:05 +0100 |
parents | 3b9a306724ec |
children | 05ec48deb353 |
line wrap: on
line diff
--- a/src/channel.c +++ b/src/channel.c @@ -1480,7 +1480,7 @@ may_invoke_callback(channel_T *channel, int seq_nr = -1; ch_mode_T ch_mode = channel->ch_part[part].ch_mode; cbq_T *cbhead = &channel->ch_part[part].ch_cb_head; - cbq_T *cbitem = cbhead->cq_next; + cbq_T *cbitem; char_u *callback = NULL; buf_T *buffer = NULL; @@ -1488,7 +1488,10 @@ may_invoke_callback(channel_T *channel, /* this channel is handled elsewhere (netbeans) */ return FALSE; - /* use a message-specific callback, part callback or channel callback */ + /* Use a message-specific callback, part callback or channel callback */ + for (cbitem = cbhead->cq_next; cbitem != NULL; cbitem = cbitem->cq_next) + if (cbitem->cq_seq_nr == 0) + break; if (cbitem != NULL) callback = cbitem->cq_callback; else if (channel->ch_part[part].ch_callback != NULL) @@ -1610,16 +1613,13 @@ may_invoke_callback(channel_T *channel, int done = FALSE; /* invoke the one-time callback with the matching nr */ - while (cbitem != NULL) - { + for (cbitem = cbhead->cq_next; cbitem != NULL; cbitem = cbitem->cq_next) if (cbitem->cq_seq_nr == seq_nr) { invoke_one_time_callback(channel, cbhead, cbitem, argv); done = TRUE; break; } - cbitem = cbitem->cq_next; - } if (!done) ch_logn(channel, "Dropping message %d without callback", seq_nr); }