changeset 15908:379247470597 v8.1.0960

patch 8.1.0960: when using ConPTY garbage collection has undefined behavior commit https://github.com/vim/vim/commit/8caa43d8159555076af6acc242185f5475c1d199 Author: Bram Moolenaar <Bram@vim.org> Date: Wed Feb 20 22:45:06 2019 +0100 patch 8.1.0960: when using ConPTY garbage collection has undefined behavior Problem: When using ConPTY garbage collection has undefined behavior. Solution: Free the channel in a better way. (Nobuhiro Takasaki, closes https://github.com/vim/vim/issues/4020)
author Bram Moolenaar <Bram@vim.org>
date Wed, 20 Feb 2019 23:00:06 +0100
parents 8412018a3e3a
children dae10aa1681d
files src/channel.c src/version.c
diffstat 2 files changed, 13 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/src/channel.c
+++ b/src/channel.c
@@ -191,7 +191,7 @@ ch_log_lead(const char *what, channel_T 
 
 static int did_log_msg = TRUE;
 
-#ifndef PROTO  /* prototype is in vim.h */
+#ifndef PROTO  // prototype is in proto.h
     void
 ch_log(channel_T *ch, const char *fmt, ...)
 {
@@ -4348,20 +4348,25 @@ channel_parse_messages(void)
 	{
 	    channel->ch_to_be_closed = (1U << PART_COUNT);
 	    channel_close_now(channel);
-	    /* channel may have been freed, start over */
+	    // channel may have been freed, start over
 	    channel = first_channel;
 	    continue;
 	}
 	if (channel->ch_to_be_freed || channel->ch_killing)
 	{
+	    if (channel->ch_killing)
+	    {
+		channel_free_contents(channel);
+		channel->ch_job->jv_channel = NULL;
+	    }
 	    channel_free(channel);
-	    /* channel has been freed, start over */
+	    // channel has been freed, start over
 	    channel = first_channel;
 	    continue;
 	}
 	if (channel->ch_refcount == 0 && !channel_still_useful(channel))
 	{
-	    /* channel is no longer useful, free it */
+	    // channel is no longer useful, free it
 	    channel_free(channel);
 	    channel = first_channel;
 	    part = PART_SOCK;
@@ -5487,15 +5492,8 @@ job_cleanup(job_T *job)
 	channel_need_redraw = TRUE;
     }
 
-    if (job->jv_channel != NULL
-	 && job->jv_channel->ch_anonymous_pipe && !job->jv_channel->ch_killing)
-    {
-	++safe_to_invoke_callback;
-	channel_free_contents(job->jv_channel);
-	job->jv_channel->ch_job = NULL;
-	job->jv_channel = NULL;
-	--safe_to_invoke_callback;
-    }
+    if (job->jv_channel != NULL && job->jv_channel->ch_anonymous_pipe)
+	job->jv_channel->ch_killing = TRUE;
 
     // Do not free the job in case the close callback of the associated channel
     // isn't invoked yet and may get information by job_info().
--- a/src/version.c
+++ b/src/version.c
@@ -780,6 +780,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    960,
+/**/
     959,
 /**/
     958,