Mercurial > vim
diff src/channel.c @ 15764:208bf8b36075 v8.1.0889
patch 8.1.0889: MS-Windows: a channel write may hang
commit https://github.com/vim/vim/commit/6524068ff3252f1373807f1ebfde21408cef624e
Author: Bram Moolenaar <Bram@vim.org>
Date: Sun Feb 10 22:23:26 2019 +0100
patch 8.1.0889: MS-Windows: a channel write may hang
Problem: MS-Windows: a channel write may hang.
Solution: Check for WriteFile() not writing anything. (Yasuhiro Matsumoto,
closes #3920)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sun, 10 Feb 2019 22:30:07 +0100 |
parents | c017195b121b |
children | 7fad90423bd2 |
line wrap: on
line diff
--- a/src/channel.c +++ b/src/channel.c @@ -91,9 +91,10 @@ fd_write(sock_T fd, char *buf, size_t le size = MAX_NAMED_PIPE_SIZE; else size = (DWORD)todo; - // If the pipe overflows while the job does not read the data, WriteFile - // will block forever. This abandons the write. + // If the pipe overflows while the job does not read the data, + // WriteFile() will block forever. This abandons the write. memset(&ov, 0, sizeof(ov)); + nwrite = 0; if (!WriteFile(h, buf + done, size, &nwrite, &ov)) { DWORD err = GetLastError(); @@ -104,6 +105,10 @@ fd_write(sock_T fd, char *buf, size_t le return -1; FlushFileBuffers(h); } + else if (nwrite == 0) + // WriteFile() returns TRUE but did not write anything. This causes + // a hang, so bail out. + break; todo -= nwrite; done += nwrite; }