diff options
author | Justin M. Keyes <justinkz@gmail.com> | 2016-05-15 20:33:12 -0400 |
---|---|---|
committer | Justin M. Keyes <justinkz@gmail.com> | 2016-05-15 20:33:12 -0400 |
commit | 082abb7ca6f45fa937a0377a5edc68929a1c08a9 (patch) | |
tree | cd242503ae8909249a03cb7871943d34ea8c7568 /src | |
parent | 3cc2a28198822a9e9de4d317d92d6a3fbd42e04a (diff) | |
parent | f583bc94fc7e08cca6ca85ea5a3cd38368e54df7 (diff) | |
download | rneovim-082abb7ca6f45fa937a0377a5edc68929a1c08a9.tar.gz rneovim-082abb7ca6f45fa937a0377a5edc68929a1c08a9.tar.bz2 rneovim-082abb7ca6f45fa937a0377a5edc68929a1c08a9.zip |
Merge pull request #4760 from justinmk/term-use-after-free
term_close use-after-free
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/eval.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c index 8c8881b398..712ee06b85 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -21701,6 +21701,18 @@ static void term_resize(uint16_t width, uint16_t height, void *d) pty_process_resize(&data->proc.pty, width, height); } +static inline void term_delayed_free(void **argv) +{ + TerminalJobData *j = argv[0]; + if (j->in.pending_reqs || j->out.pending_reqs || j->err.pending_reqs) { + queue_put(j->events, term_delayed_free, 1, j); + return; + } + + terminal_destroy(j->term); + term_job_data_decref(j); +} + static void term_close(void *d) { TerminalJobData *data = d; @@ -21708,8 +21720,7 @@ static void term_close(void *d) data->exited = true; process_stop((Process *)&data->proc); } - terminal_destroy(data->term); - term_job_data_decref(d); + queue_put(data->events, term_delayed_free, 1, data); } static void term_job_data_decref(TerminalJobData *data) |