Mercurial > vim
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 |