changeset 19772:472dc753e985 v8.2.0442

patch 8.2.0442: channel contents might be used after being freed Commit: https://github.com/vim/vim/commit/71658f74ae64c366b2d35b82c0a2eadb1317f028 Author: Bram Moolenaar <Bram@vim.org> Date: Tue Mar 24 20:35:19 2020 +0100 patch 8.2.0442: channel contents might be used after being freed Problem: Channel contents might be used after being freed. Solution: Reset the job channel before freeing the channel.
author Bram Moolenaar <Bram@vim.org>
date Tue, 24 Mar 2020 20:45:03 +0100
parents ff2bd976083b
children c8242fe426a7
files src/channel.c src/version.c
diffstat 2 files changed, 11 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/src/channel.c
+++ b/src/channel.c
@@ -396,6 +396,7 @@ channel_can_close(channel_T *channel)
 
 /*
  * Close a channel and free all its resources.
+ * The "channel" pointer remains valid.
  */
     static void
 channel_free_contents(channel_T *channel)
@@ -405,6 +406,9 @@ channel_free_contents(channel_T *channel
     ch_log(channel, "Freeing channel");
 }
 
+/*
+ * Unlink "channel" from the list of channels and free it.
+ */
     static void
 channel_free_channel(channel_T *channel)
 {
@@ -497,10 +501,8 @@ free_unused_channels(int copyID, int mas
 	ch_next = ch->ch_next;
 	if (!channel_still_useful(ch)
 				 && (ch->ch_copyID & mask) != (copyID & mask))
-	{
 	    // Free the channel struct itself.
 	    channel_free_channel(ch);
-	}
     }
 }
 
@@ -4454,15 +4456,12 @@ channel_parse_messages(void)
 	}
 	if (channel->ch_to_be_freed || channel->ch_killing)
 	{
-	    if (channel->ch_killing)
-	    {
-		channel_free_contents(channel);
-		channel_free_channel(channel);
+	    channel_free_contents(channel);
+	    if (channel->ch_job != NULL)
 		channel->ch_job->jv_channel = NULL;
-	    }
-	    else
-		channel_free(channel);
-	    // channel has been freed, start over
+
+	    // free the channel and then start over
+	    channel_free_channel(channel);
 	    channel = first_channel;
 	    continue;
 	}
--- a/src/version.c
+++ b/src/version.c
@@ -739,6 +739,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    442,
+/**/
     441,
 /**/
     440,