@@ -2355,8 +2355,9 @@ may_invoke_callback(channel_T *channel, int part)
23552355 typval_T * listtv = NULL ;
23562356 typval_T argv [CH_JSON_MAX_ARGS ];
23572357 int seq_nr = -1 ;
2358- ch_mode_T ch_mode = channel -> ch_part [part ].ch_mode ;
2359- cbq_T * cbhead = & channel -> ch_part [part ].ch_cb_head ;
2358+ chanpart_T * ch_part = & channel -> ch_part [part ];
2359+ ch_mode_T ch_mode = ch_part -> ch_mode ;
2360+ cbq_T * cbhead = & ch_part -> ch_cb_head ;
23602361 cbq_T * cbitem ;
23612362 char_u * callback = NULL ;
23622363 partial_T * partial = NULL ;
@@ -2376,22 +2377,22 @@ may_invoke_callback(channel_T *channel, int part)
23762377 callback = cbitem -> cq_callback ;
23772378 partial = cbitem -> cq_partial ;
23782379 }
2379- else if (channel -> ch_part [ part ]. ch_callback != NULL )
2380+ else if (ch_part -> ch_callback != NULL )
23802381 {
2381- callback = channel -> ch_part [ part ]. ch_callback ;
2382- partial = channel -> ch_part [ part ]. ch_partial ;
2382+ callback = ch_part -> ch_callback ;
2383+ partial = ch_part -> ch_partial ;
23832384 }
23842385 else
23852386 {
23862387 callback = channel -> ch_callback ;
23872388 partial = channel -> ch_partial ;
23882389 }
23892390
2390- buffer = channel -> ch_part [ part ]. ch_bufref .br_buf ;
2391- if (buffer != NULL && !bufref_valid (& channel -> ch_part [ part ]. ch_bufref ))
2391+ buffer = ch_part -> ch_bufref .br_buf ;
2392+ if (buffer != NULL && !bufref_valid (& ch_part -> ch_bufref ))
23922393 {
23932394 /* buffer was wiped out */
2394- channel -> ch_part [ part ]. ch_bufref .br_buf = NULL ;
2395+ ch_part -> ch_bufref .br_buf = NULL ;
23952396 buffer = NULL ;
23962397 }
23972398
@@ -2452,7 +2453,7 @@ may_invoke_callback(channel_T *channel, int part)
24522453
24532454 if (ch_mode == MODE_NL )
24542455 {
2455- char_u * nl ;
2456+ char_u * nl = NULL ;
24562457 char_u * buf ;
24572458 readq_T * node ;
24582459
@@ -2465,10 +2466,25 @@ may_invoke_callback(channel_T *channel, int part)
24652466 if (nl != NULL )
24662467 break ;
24672468 if (channel_collapse (channel , part , TRUE) == FAIL )
2469+ {
2470+ if (ch_part -> ch_fd == INVALID_FD && node -> rq_buflen > 0 )
2471+ break ;
24682472 return FALSE; /* incomplete message */
2473+ }
24692474 }
24702475 buf = node -> rq_buffer ;
24712476
2477+ if (nl == NULL )
2478+ {
2479+ /* Flush remaining message that is missing a NL. */
2480+ buf = vim_realloc (buf , node -> rq_buflen + 1 );
2481+ if (buf == NULL )
2482+ return FALSE;
2483+ node -> rq_buffer = buf ;
2484+ nl = buf + node -> rq_buflen ++ ;
2485+ * nl = NUL ;
2486+ }
2487+
24722488 /* Convert NUL to NL, the internal representation. */
24732489 for (p = buf ; p < nl && p < buf + node -> rq_buflen ; ++ p )
24742490 if (* p == NUL )
0 commit comments