comparison src/channel.c @ 11959:91a26b7a4119 v8.0.0860

patch 8.0.0860: side effects when channel appends to a buffer commit https://github.com/vim/vim/commit/6b7355a30ddd294c19cd9be924d487d592ccfae1 Author: Bram Moolenaar <Bram@vim.org> Date: Fri Aug 4 21:37:54 2017 +0200 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)
author Christian Brabandt <cb@256bit.org>
date Fri, 04 Aug 2017 21:45:04 +0200
parents ef1febf04d03
children 12833414cc02
comparison
equal deleted inserted replaced
11958:052270a67371 11959:91a26b7a4119
2282 } 2282 }
2283 2283
2284 static void 2284 static void
2285 append_to_buffer(buf_T *buffer, char_u *msg, channel_T *channel, ch_part_T part) 2285 append_to_buffer(buf_T *buffer, char_u *msg, channel_T *channel, ch_part_T part)
2286 { 2286 {
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;
2288 linenr_T lnum = buffer->b_ml.ml_line_count; 2290 linenr_T lnum = buffer->b_ml.ml_line_count;
2289 int save_write_to = buffer->b_write_to_channel; 2291 int save_write_to = buffer->b_write_to_channel;
2290 chanpart_T *ch_part = &channel->ch_part[part]; 2292 chanpart_T *ch_part = &channel->ch_part[part];
2291 int save_p_ma = buffer->b_p_ma; 2293 int save_p_ma = buffer->b_p_ma;
2292 int empty = (buffer->b_ml.ml_flags & ML_EMPTY) ? 1 : 0; 2294 int empty = (buffer->b_ml.ml_flags & ML_EMPTY) ? 1 : 0;
2311 2313
2312 /* Append to the buffer */ 2314 /* Append to the buffer */
2313 ch_log(channel, "appending line %d to buffer", (int)lnum + 1 - empty); 2315 ch_log(channel, "appending line %d to buffer", (int)lnum + 1 - empty);
2314 2316
2315 buffer->b_p_ma = TRUE; 2317 buffer->b_p_ma = TRUE;
2316 curbuf = buffer; 2318
2317 curwin->w_buffer = curbuf; 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
2318 u_sync(TRUE); 2322 u_sync(TRUE);
2319 /* ignore undo failure, undo is not very useful here */ 2323 /* ignore undo failure, undo is not very useful here */
2320 ignored = u_save(lnum - empty, lnum + 1); 2324 ignored = u_save(lnum - empty, lnum + 1);
2321 2325
2322 if (empty) 2326 if (empty)
2326 lnum = 0; 2330 lnum = 0;
2327 } 2331 }
2328 else 2332 else
2329 ml_append(lnum, msg, 0, FALSE); 2333 ml_append(lnum, msg, 0, FALSE);
2330 appended_lines_mark(lnum, 1L); 2334 appended_lines_mark(lnum, 1L);
2331 curbuf = save_curbuf; 2335
2332 curwin->w_buffer = curbuf; 2336 /* Restore curbuf/curwin/curtab */
2337 restore_win_for_buf(save_curwin, save_curtab, &save_curbuf);
2338
2333 if (ch_part->ch_nomodifiable) 2339 if (ch_part->ch_nomodifiable)
2334 buffer->b_p_ma = FALSE; 2340 buffer->b_p_ma = FALSE;
2335 else 2341 else
2336 buffer->b_p_ma = save_p_ma; 2342 buffer->b_p_ma = save_p_ma;
2337 2343
2338 if (buffer->b_nwindows > 0) 2344 if (buffer->b_nwindows > 0)
2339 { 2345 {
2340 win_T *wp; 2346 win_T *wp;
2341 win_T *save_curwin;
2342 2347
2343 FOR_ALL_WINDOWS(wp) 2348 FOR_ALL_WINDOWS(wp)
2344 { 2349 {
2345 if (wp->w_buffer == buffer 2350 if (wp->w_buffer == buffer
2346 && (save_write_to 2351 && (save_write_to