@@ -888,8 +888,7 @@ channel_parse_json(channel_T *channel)
888888}
889889
890890/*
891- * Remove "node" from the queue that it is in and free it.
892- * Also frees the contained callback name.
891+ * Remove "node" from the queue that it is in. Does not free it.
893892 */
894893 static void
895894remove_cb_node (cbq_T * head , cbq_T * node )
@@ -902,8 +901,6 @@ remove_cb_node(cbq_T *head, cbq_T *node)
902901 head -> cq_prev = node -> cq_prev ;
903902 else
904903 node -> cq_next -> cq_prev = node -> cq_prev ;
905- vim_free (node -> cq_callback );
906- vim_free (node );
907904}
908905
909906/*
@@ -1144,8 +1141,12 @@ may_invoke_callback(channel_T *channel)
11441141 if (item -> cq_seq_nr == seq_nr )
11451142 {
11461143 ch_log (channel , "Invoking one-time callback\n" );
1147- invoke_callback (channel , item -> cq_callback , argv );
1144+ /* Remove the item from the list first, if the callback
1145+ * invokes ch_close() the list will be cleared. */
11481146 remove_cb_node (head , item );
1147+ invoke_callback (channel , item -> cq_callback , argv );
1148+ vim_free (item -> cq_callback );
1149+ vim_free (item );
11491150 done = TRUE;
11501151 break ;
11511152 }
@@ -1329,7 +1330,13 @@ channel_clear(channel_T *channel)
13291330 vim_free (channel_get (channel ));
13301331
13311332 while (cb_head -> cq_next != NULL )
1332- remove_cb_node (cb_head , cb_head -> cq_next );
1333+ {
1334+ cbq_T * node = cb_head -> cq_next ;
1335+
1336+ remove_cb_node (cb_head , node );
1337+ vim_free (node -> cq_callback );
1338+ vim_free (node );
1339+ }
13331340
13341341 while (json_head -> jq_next != NULL )
13351342 {
0 commit comments