@@ -2376,8 +2376,9 @@ may_invoke_callback(channel_T *channel, int part)
23762376 typval_T * listtv = NULL ;
23772377 typval_T argv [CH_JSON_MAX_ARGS ];
23782378 int seq_nr = -1 ;
2379- ch_mode_T ch_mode = channel -> ch_part [part ].ch_mode ;
2380- cbq_T * cbhead = & channel -> ch_part [part ].ch_cb_head ;
2379+ chanpart_T * ch_part = & channel -> ch_part [part ];
2380+ ch_mode_T ch_mode = ch_part -> ch_mode ;
2381+ cbq_T * cbhead = & ch_part -> ch_cb_head ;
23812382 cbq_T * cbitem ;
23822383 char_u * callback = NULL ;
23832384 partial_T * partial = NULL ;
@@ -2397,22 +2398,22 @@ may_invoke_callback(channel_T *channel, int part)
23972398 callback = cbitem -> cq_callback ;
23982399 partial = cbitem -> cq_partial ;
23992400 }
2400- else if (channel -> ch_part [ part ]. ch_callback != NULL )
2401+ else if (ch_part -> ch_callback != NULL )
24012402 {
2402- callback = channel -> ch_part [ part ]. ch_callback ;
2403- partial = channel -> ch_part [ part ]. ch_partial ;
2403+ callback = ch_part -> ch_callback ;
2404+ partial = ch_part -> ch_partial ;
24042405 }
24052406 else
24062407 {
24072408 callback = channel -> ch_callback ;
24082409 partial = channel -> ch_partial ;
24092410 }
24102411
2411- buffer = channel -> ch_part [ part ]. ch_bufref .br_buf ;
2412- if (buffer != NULL && !bufref_valid (& channel -> ch_part [ part ]. ch_bufref ))
2412+ buffer = ch_part -> ch_bufref .br_buf ;
2413+ if (buffer != NULL && !bufref_valid (& ch_part -> ch_bufref ))
24132414 {
24142415 /* buffer was wiped out */
2415- channel -> ch_part [ part ]. ch_bufref .br_buf = NULL ;
2416+ ch_part -> ch_bufref .br_buf = NULL ;
24162417 buffer = NULL ;
24172418 }
24182419
@@ -2473,7 +2474,7 @@ may_invoke_callback(channel_T *channel, int part)
24732474
24742475 if (ch_mode == MODE_NL )
24752476 {
2476- char_u * nl ;
2477+ char_u * nl = NULL ;
24772478 char_u * buf ;
24782479 readq_T * node ;
24792480
@@ -2486,10 +2487,25 @@ may_invoke_callback(channel_T *channel, int part)
24862487 if (nl != NULL )
24872488 break ;
24882489 if (channel_collapse (channel , part , TRUE) == FAIL )
2490+ {
2491+ if (ch_part -> ch_fd == INVALID_FD && node -> rq_buflen > 0 )
2492+ break ;
24892493 return FALSE; /* incomplete message */
2494+ }
24902495 }
24912496 buf = node -> rq_buffer ;
24922497
2498+ if (nl == NULL )
2499+ {
2500+ /* Flush remaining message that is missing a NL. */
2501+ buf = vim_realloc (buf , node -> rq_buflen + 1 );
2502+ if (buf == NULL )
2503+ return FALSE;
2504+ node -> rq_buffer = buf ;
2505+ nl = buf + node -> rq_buflen ++ ;
2506+ * nl = NUL ;
2507+ }
2508+
24932509 /* Convert NUL to NL, the internal representation. */
24942510 for (p = buf ; p < nl && p < buf + node -> rq_buflen ; ++ p )
24952511 if (* p == NUL )
0 commit comments