changeset 15679:d8b4cbb14e1e v8.1.0847

patch 8.1.0847: may use terminal after it was cleaned up commit https://github.com/vim/vim/commit/9172d23d05f3f25996e03612654920b01158d734 Author: Bram Moolenaar <Bram@vim.org> Date: Tue Jan 29 23:06:54 2019 +0100 patch 8.1.0847: may use terminal after it was cleaned up Problem: May use terminal after it was cleaned up. Solution: Use the job pointer.
author Bram Moolenaar <Bram@vim.org>
date Tue, 29 Jan 2019 23:15:05 +0100
parents de793242c37a
children 78587768d8ac
files src/terminal.c src/version.c
diffstat 2 files changed, 13 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/terminal.c
+++ b/src/terminal.c
@@ -1375,19 +1375,24 @@ term_try_stop_job(buf_T *buf)
 
     job_stop(buf->b_term->tl_job, NULL, how);
 
-    /* wait for up to a second for the job to die */
+    // wait for up to a second for the job to die
     for (count = 0; count < 100; ++count)
     {
-	/* buffer, terminal and job may be cleaned up while waiting */
+	job_T *job;
+
+	// buffer, terminal and job may be cleaned up while waiting
 	if (!buf_valid(buf)
 		|| buf->b_term == NULL
 		|| buf->b_term->tl_job == NULL)
 	    return OK;
-
-	/* call job_status() to update jv_status */
-	job_status(buf->b_term->tl_job);
-	if (buf->b_term->tl_job->jv_status >= JOB_ENDED)
+	job = buf->b_term->tl_job;
+
+	// Call job_status() to update jv_status. It may cause the job to be
+	// cleaned up but it won't be freed.
+	job_status(job);
+	if (job->jv_status >= JOB_ENDED)
 	    return OK;
+
 	ui_delay(10L, FALSE);
 	mch_check_messages();
 	parse_queued_messages();
--- a/src/version.c
+++ b/src/version.c
@@ -784,6 +784,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    847,
+/**/
     846,
 /**/
     845,