Mercurial > vim
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();