aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoroni-link <knil.ino@gmail.com>2015-01-11 22:06:23 +0100
committeroni-link <knil.ino@gmail.com>2015-01-11 23:28:02 +0100
commit5c22f07c4f2b8ae9f7d756373ae8541051d7bd81 (patch)
tree5b956f1e08127483f99fa2edfcf6aa579e118bc8
parent7f30439d0f4d8d7e6b18f56d83d6fe868c84318c (diff)
downloadrneovim-5c22f07c4f2b8ae9f7d756373ae8541051d7bd81.tar.gz
rneovim-5c22f07c4f2b8ae9f7d756373ae8541051d7bd81.tar.bz2
rneovim-5c22f07c4f2b8ae9f7d756373ae8541051d7bd81.zip
job.c: Prevent early return from job_wait().
A blocking call job_wait(job, -1) can only return after job is finished and all handles of job are closed. But hitting CTRL-C makes job_wait() return early while handles can still be open. This can lead to problems with the job/handle callbacks if the caller (of job_wait()) already freed the memory that is used in the job callbacks. To fix this, only return after all handles of the job are closed.
-rw-r--r--src/nvim/os/job.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/nvim/os/job.c b/src/nvim/os/job.c
index 17872ab9c9..8db5e3cc39 100644
--- a/src/nvim/os/job.c
+++ b/src/nvim/os/job.c
@@ -310,8 +310,15 @@ int job_wait(Job *job, int ms) FUNC_ATTR_NONNULL_ALL
// we'll assume that a user frantically hitting interrupt doesn't like
// the current job. Signal that it has to be killed.
if (got_int) {
+ got_int = false;
job_stop(job);
- event_poll(0);
+ if (ms == -1) {
+ // We can only return, if all streams/handles are closed and the job
+ // exited.
+ event_poll_until(-1, job->refcount == 1);
+ } else {
+ event_poll(0);
+ }
}
if (job->refcount == 1) {