From f2b94a3b499667cefe848ecc57487c8fe62584f4 Mon Sep 17 00:00:00 2001 From: James Ross-Gowan Date: Wed, 19 Nov 2014 15:46:20 +1100 Subject: lua: subprocess: cancel pending I/O before return I'm not sure if this is necessary, but it can't hurt, and it's what you're supposed to do before leaving the stack frame that contains the OVERLAPPED object and the buffer. If there is no pending I/O, CancelIo will do nothing and GetOverlappedResult will silently fail. --- player/lua.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/player/lua.c b/player/lua.c index 8a2e3ec925..f46094f79c 100644 --- a/player/lua.c +++ b/player/lua.c @@ -1422,9 +1422,14 @@ static int subprocess(char **args, struct mp_cancel *cancel, void *ctx, done: for (int i = 0; i < 2; i++) { - if (pipes[i].ol.hEvent) CloseHandle(pipes[i].ol.hEvent); - if (pipes[i].read) CloseHandle(pipes[i].read); + if (pipes[i].read) { + // Cancel any pending I/O (if the process was killed) + CancelIo(pipes[i].read); + GetOverlappedResult(pipes[i].read, &pipes[i].ol, &r, TRUE); + CloseHandle(pipes[i].read); + } if (pipes[i].write) CloseHandle(pipes[i].write); + if (pipes[i].ol.hEvent) CloseHandle(pipes[i].ol.hEvent); } if (pi.hProcess) CloseHandle(pi.hProcess); talloc_free(tmp); -- cgit v1.2.3