Skip to content

Commit 6b7355a

Browse files
committed
patch 8.0.0860: side effects when channel appends to a buffer
Problem: There may be side effects when a channel appends to a buffer that is not the current buffer. Solution: Properly switch to another buffer before appending. (Yasuhiro Matsumoto, closes #1926, closes #1937)
1 parent 8e5eece commit 6b7355a

File tree

5 files changed

+59
-44
lines changed

5 files changed

+59
-44
lines changed

src/buffer.c

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5794,9 +5794,52 @@ buf_spname(buf_T *buf)
57945794
return NULL;
57955795
}
57965796

5797-
#if (defined(FEAT_QUICKFIX) && defined(FEAT_WINDOWS)) \
5797+
#if defined(FEAT_JOB_CHANNEL) \
57985798
|| defined(FEAT_PYTHON) || defined(FEAT_PYTHON3) \
57995799
|| defined(PROTO)
5800+
# define SWITCH_TO_WIN
5801+
5802+
/*
5803+
* Find a window that contains "buf" and switch to it.
5804+
* If there is no such window, use the current window and change "curbuf".
5805+
* Caller must initialize save_curbuf to NULL.
5806+
* restore_win_for_buf() MUST be called later!
5807+
*/
5808+
void
5809+
switch_to_win_for_buf(
5810+
buf_T *buf,
5811+
win_T **save_curwinp,
5812+
tabpage_T **save_curtabp,
5813+
bufref_T *save_curbuf)
5814+
{
5815+
win_T *wp;
5816+
tabpage_T *tp;
5817+
5818+
if (find_win_for_buf(buf, &wp, &tp) == FAIL)
5819+
switch_buffer(save_curbuf, buf);
5820+
else if (switch_win(save_curwinp, save_curtabp, wp, tp, TRUE) == FAIL)
5821+
{
5822+
restore_win(*save_curwinp, *save_curtabp, TRUE);
5823+
switch_buffer(save_curbuf, buf);
5824+
}
5825+
}
5826+
5827+
void
5828+
restore_win_for_buf(
5829+
win_T *save_curwin,
5830+
tabpage_T *save_curtab,
5831+
bufref_T *save_curbuf)
5832+
{
5833+
if (save_curbuf->br_buf == NULL)
5834+
restore_win(save_curwin, save_curtab, TRUE);
5835+
else
5836+
restore_buffer(save_curbuf);
5837+
}
5838+
#endif
5839+
5840+
#if (defined(FEAT_QUICKFIX) && defined(FEAT_WINDOWS)) \
5841+
|| defined(SWITCH_TO_WIN) \
5842+
|| defined(PROTO)
58005843
/*
58015844
* Find a window for buffer "buf".
58025845
* If found OK is returned and "wp" and "tp" are set to the window and tabpage.

src/channel.c

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2284,7 +2284,9 @@ invoke_one_time_callback(
22842284
static void
22852285
append_to_buffer(buf_T *buffer, char_u *msg, channel_T *channel, ch_part_T part)
22862286
{
2287-
buf_T *save_curbuf = curbuf;
2287+
bufref_T save_curbuf = {NULL, 0, 0};
2288+
win_T *save_curwin = NULL;
2289+
tabpage_T *save_curtab = NULL;
22882290
linenr_T lnum = buffer->b_ml.ml_line_count;
22892291
int save_write_to = buffer->b_write_to_channel;
22902292
chanpart_T *ch_part = &channel->ch_part[part];
@@ -2313,8 +2315,10 @@ append_to_buffer(buf_T *buffer, char_u *msg, channel_T *channel, ch_part_T part)
23132315
ch_log(channel, "appending line %d to buffer", (int)lnum + 1 - empty);
23142316

23152317
buffer->b_p_ma = TRUE;
2316-
curbuf = buffer;
2317-
curwin->w_buffer = curbuf;
2318+
2319+
/* Save curbuf/curwin/curtab and make "buffer" the current buffer. */
2320+
switch_to_win_for_buf(buffer, &save_curwin, &save_curtab, &save_curbuf);
2321+
23182322
u_sync(TRUE);
23192323
/* ignore undo failure, undo is not very useful here */
23202324
ignored = u_save(lnum - empty, lnum + 1);
@@ -2328,8 +2332,10 @@ append_to_buffer(buf_T *buffer, char_u *msg, channel_T *channel, ch_part_T part)
23282332
else
23292333
ml_append(lnum, msg, 0, FALSE);
23302334
appended_lines_mark(lnum, 1L);
2331-
curbuf = save_curbuf;
2332-
curwin->w_buffer = curbuf;
2335+
2336+
/* Restore curbuf/curwin/curtab */
2337+
restore_win_for_buf(save_curwin, save_curtab, &save_curbuf);
2338+
23332339
if (ch_part->ch_nomodifiable)
23342340
buffer->b_p_ma = FALSE;
23352341
else
@@ -2338,7 +2344,6 @@ append_to_buffer(buf_T *buffer, char_u *msg, channel_T *channel, ch_part_T part)
23382344
if (buffer->b_nwindows > 0)
23392345
{
23402346
win_T *wp;
2341-
win_T *save_curwin;
23422347

23432348
FOR_ALL_WINDOWS(wp)
23442349
{

src/if_py_both.h

Lines changed: 0 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -4262,43 +4262,6 @@ py_fix_cursor(linenr_T lo, linenr_T hi, linenr_T extra)
42624262
invalidate_botline();
42634263
}
42644264

4265-
/*
4266-
* Find a window that contains "buf" and switch to it.
4267-
* If there is no such window, use the current window and change "curbuf".
4268-
* Caller must initialize save_curbuf to NULL.
4269-
* restore_win_for_buf() MUST be called later!
4270-
*/
4271-
static void
4272-
switch_to_win_for_buf(
4273-
buf_T *buf,
4274-
win_T **save_curwinp,
4275-
tabpage_T **save_curtabp,
4276-
bufref_T *save_curbuf)
4277-
{
4278-
win_T *wp;
4279-
tabpage_T *tp;
4280-
4281-
if (find_win_for_buf(buf, &wp, &tp) == FAIL)
4282-
switch_buffer(save_curbuf, buf);
4283-
else if (switch_win(save_curwinp, save_curtabp, wp, tp, TRUE) == FAIL)
4284-
{
4285-
restore_win(*save_curwinp, *save_curtabp, TRUE);
4286-
switch_buffer(save_curbuf, buf);
4287-
}
4288-
}
4289-
4290-
static void
4291-
restore_win_for_buf(
4292-
win_T *save_curwin,
4293-
tabpage_T *save_curtab,
4294-
bufref_T *save_curbuf)
4295-
{
4296-
if (save_curbuf->br_buf == NULL)
4297-
restore_win(save_curwin, save_curtab, TRUE);
4298-
else
4299-
restore_buffer(save_curbuf);
4300-
}
4301-
43024265
/*
43034266
* Replace a line in the specified buffer. The line number is
43044267
* in Vim format (1-based). The replacement line is given as

src/proto/buffer.pro

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ int bt_dontwrite(buf_T *buf);
6161
int bt_dontwrite_msg(buf_T *buf);
6262
int buf_hide(buf_T *buf);
6363
char_u *buf_spname(buf_T *buf);
64+
void switch_to_win_for_buf(buf_T *buf, win_T **save_curwinp, tabpage_T **save_curtabp, bufref_T *save_curbuf);
65+
void restore_win_for_buf(win_T *save_curwin, tabpage_T *save_curtab, bufref_T *save_curbuf);
6466
int find_win_for_buf(buf_T *buf, win_T **wp, tabpage_T **tp);
6567
void buf_addsign(buf_T *buf, int id, linenr_T lnum, int typenr);
6668
linenr_T buf_change_sign_type(buf_T *buf, int markId, int typenr);

src/version.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -769,6 +769,8 @@ static char *(features[]) =
769769

770770
static int included_patches[] =
771771
{ /* Add new patch number below this line */
772+
/**/
773+
860,
772774
/**/
773775
859,
774776
/**/

0 commit comments

Comments
 (0)