summaryrefslogtreecommitdiff
path: root/data/vim/patches/8.1.0342
diff options
context:
space:
mode:
Diffstat (limited to 'data/vim/patches/8.1.0342')
-rw-r--r--data/vim/patches/8.1.0342239
1 files changed, 239 insertions, 0 deletions
diff --git a/data/vim/patches/8.1.0342 b/data/vim/patches/8.1.0342
new file mode 100644
index 000000000..3ea1ac3f5
--- /dev/null
+++ b/data/vim/patches/8.1.0342
@@ -0,0 +1,239 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0342
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0342
+Problem: Crash when a callback deletes a window that is being used.
+Solution: Do not unload a buffer that is being displayed while redrawing the
+ screen. Also avoid invoking callbacks while redrawing.
+ (closes #2107)
+Files: src/buffer.c, src/misc2.c
+
+
+*** ../vim-8.1.0341/src/buffer.c 2018-08-21 18:50:11.153501902 +0200
+--- src/buffer.c 2018-09-01 15:16:57.753412395 +0200
+***************
+*** 412,418 ****
+ hash_remove(&buf_hashtab, hi);
+ }
+
+! static char *e_buflocked = N_("E937: Attempt to delete a buffer that is in use");
+
+ /*
+ * Close the link to a buffer.
+--- 412,439 ----
+ hash_remove(&buf_hashtab, hi);
+ }
+
+! /*
+! * Return TRUE when buffer "buf" can be unloaded.
+! * Give an error message and return FALSE when the buffer is locked or the
+! * screen is being redrawn and the buffer is in a window.
+! */
+! static int
+! can_unload_buffer(buf_T *buf)
+! {
+! int can_unload = !buf->b_locked;
+!
+! if (can_unload && updating_screen)
+! {
+! win_T *wp;
+!
+! FOR_ALL_WINDOWS(wp)
+! if (wp->w_buffer == buf)
+! can_unload = FALSE;
+! }
+! if (!can_unload)
+! EMSG(_("E937: Attempt to delete a buffer that is in use"));
+! return can_unload;
+! }
+
+ /*
+ * Close the link to a buffer.
+***************
+*** 474,484 ****
+ {
+ if (wipe_buf || unload_buf)
+ {
+! if (buf->b_locked)
+! {
+! EMSG(_(e_buflocked));
+ return;
+! }
+ /* Wiping out or unloading a terminal buffer kills the job. */
+ free_terminal(buf);
+ }
+--- 495,503 ----
+ {
+ if (wipe_buf || unload_buf)
+ {
+! if (!can_unload_buffer(buf))
+ return;
+!
+ /* Wiping out or unloading a terminal buffer kills the job. */
+ free_terminal(buf);
+ }
+***************
+*** 501,511 ****
+
+ /* Disallow deleting the buffer when it is locked (already being closed or
+ * halfway a command that relies on it). Unloading is allowed. */
+! if (buf->b_locked > 0 && (del_buf || wipe_buf))
+! {
+! EMSG(_(e_buflocked));
+ return;
+- }
+
+ /* check no autocommands closed the window */
+ if (win != NULL && win_valid_any_tab(win))
+--- 520,527 ----
+
+ /* Disallow deleting the buffer when it is locked (already being closed or
+ * halfway a command that relies on it). Unloading is allowed. */
+! if ((del_buf || wipe_buf) && !can_unload_buffer(buf))
+ return;
+
+ /* check no autocommands closed the window */
+ if (win != NULL && win_valid_any_tab(win))
+***************
+*** 1196,1203 ****
+ return errormsg;
+ }
+
+- static int empty_curbuf(int close_others, int forceit, int action);
+-
+ /*
+ * Make the current buffer empty.
+ * Used when it is wiped out and it's the last buffer.
+--- 1212,1217 ----
+***************
+*** 1238,1243 ****
+--- 1252,1258 ----
+ need_fileinfo = FALSE;
+ return retval;
+ }
++
+ /*
+ * Implementation of the commands for the buffer list.
+ *
+***************
+*** 1359,1369 ****
+ int forward;
+ bufref_T bufref;
+
+! if (buf->b_locked)
+! {
+! EMSG(_(e_buflocked));
+ return FAIL;
+- }
+
+ set_bufref(&bufref, buf);
+
+--- 1374,1381 ----
+ int forward;
+ bufref_T bufref;
+
+! if (!can_unload_buffer(buf))
+ return FAIL;
+
+ set_bufref(&bufref, buf);
+
+*** ../vim-8.1.0341/src/misc2.c 2018-07-29 16:09:14.636945607 +0200
+--- src/misc2.c 2018-09-01 15:07:10.019535433 +0200
+***************
+*** 6366,6398 ****
+ {
+ win_T *old_curwin = curwin;
+
+! /* For Win32 mch_breakcheck() does not check for input, do it here. */
+ # if defined(WIN32) && defined(FEAT_JOB_CHANNEL)
+ channel_handle_events(FALSE);
+ # endif
+
+ # ifdef FEAT_NETBEANS_INTG
+! /* Process the queued netbeans messages. */
+ netbeans_parse_messages();
+ # endif
+ # ifdef FEAT_JOB_CHANNEL
+! /* Write any buffer lines still to be written. */
+ channel_write_any_lines();
+
+! /* Process the messages queued on channels. */
+ channel_parse_messages();
+ # endif
+ # if defined(FEAT_CLIENTSERVER) && defined(FEAT_X11)
+! /* Process the queued clientserver messages. */
+ server_parse_messages();
+ # endif
+ # ifdef FEAT_JOB_CHANNEL
+! /* Check if any jobs have ended. */
+ job_check_ended();
+ # endif
+
+! /* If the current window changed we need to bail out of the waiting loop.
+! * E.g. when a job exit callback closes the terminal window. */
+ if (curwin != old_curwin)
+ ins_char_typebuf(K_IGNORE);
+ }
+--- 6366,6403 ----
+ {
+ win_T *old_curwin = curwin;
+
+! // Do not handle messages while redrawing, because it may cause buffers to
+! // change or be wiped while they are being redrawn.
+! if (updating_screen)
+! return;
+!
+! // For Win32 mch_breakcheck() does not check for input, do it here.
+ # if defined(WIN32) && defined(FEAT_JOB_CHANNEL)
+ channel_handle_events(FALSE);
+ # endif
+
+ # ifdef FEAT_NETBEANS_INTG
+! // Process the queued netbeans messages.
+ netbeans_parse_messages();
+ # endif
+ # ifdef FEAT_JOB_CHANNEL
+! // Write any buffer lines still to be written.
+ channel_write_any_lines();
+
+! // Process the messages queued on channels.
+ channel_parse_messages();
+ # endif
+ # if defined(FEAT_CLIENTSERVER) && defined(FEAT_X11)
+! // Process the queued clientserver messages.
+ server_parse_messages();
+ # endif
+ # ifdef FEAT_JOB_CHANNEL
+! // Check if any jobs have ended.
+ job_check_ended();
+ # endif
+
+! // If the current window changed we need to bail out of the waiting loop.
+! // E.g. when a job exit callback closes the terminal window.
+ if (curwin != old_curwin)
+ ins_char_typebuf(K_IGNORE);
+ }
+*** ../vim-8.1.0341/src/version.c 2018-08-31 23:06:18.735841246 +0200
+--- src/version.c 2018-09-01 15:02:16.242604587 +0200
+***************
+*** 796,797 ****
+--- 796,799 ----
+ { /* Add new patch number below this line */
++ /**/
++ 342,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+5. You find yourself brainstorming for new subjects to search.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///