Skip to content

Commit 7bffaa9

Browse files
committed
patch 7.4.1532
Problem: MS-Windows channel leaks file descriptor. Solution: Use CreateFile with the right options. (Yasuhiro Matsumoto)
1 parent 40e8cb2 commit 7bffaa9

2 files changed

Lines changed: 49 additions & 9 deletions

File tree

src/os_win32.c

Lines changed: 47 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4992,6 +4992,41 @@ mch_call_shell(
49924992
}
49934993

49944994
#if defined(FEAT_JOB) || defined(PROTO)
4995+
static HANDLE
4996+
job_io_file_open(
4997+
char_u *fname,
4998+
DWORD dwDesiredAccess,
4999+
DWORD dwShareMode,
5000+
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
5001+
DWORD dwCreationDisposition,
5002+
DWORD dwFlagsAndAttributes)
5003+
{
5004+
HANDLE h;
5005+
# ifdef FEAT_MBYTE
5006+
WCHAR *wn = NULL;
5007+
if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
5008+
{
5009+
wn = enc_to_utf16(fname, NULL);
5010+
if (wn != NULL)
5011+
{
5012+
h = CreateFileW(wn, dwDesiredAccess, dwShareMode,
5013+
lpSecurityAttributes, dwCreationDisposition,
5014+
dwFlagsAndAttributes, NULL);
5015+
vim_free(wn);
5016+
if (h == INVALID_HANDLE_VALUE
5017+
&& GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
5018+
wn = NULL;
5019+
}
5020+
}
5021+
if (wn == NULL)
5022+
# endif
5023+
5024+
h = CreateFile((LPCSTR)fname, dwDesiredAccess, dwShareMode,
5025+
lpSecurityAttributes, dwCreationDisposition,
5026+
dwFlagsAndAttributes, NULL);
5027+
return h;
5028+
}
5029+
49955030
void
49965031
mch_start_job(char *cmd, job_T *job, jobopt_T *options)
49975032
{
@@ -5046,13 +5081,14 @@ mch_start_job(char *cmd, job_T *job, jobopt_T *options)
50465081
{
50475082
char_u *fname = options->jo_io_name[PART_IN];
50485083

5049-
int fd = mch_open((char *)fname, O_RDONLY, 0);
5050-
if (fd < 0)
5084+
ifd[0] = job_io_file_open(fname, GENERIC_READ,
5085+
FILE_SHARE_READ | FILE_SHARE_WRITE,
5086+
&saAttr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL);
5087+
if (ifd[0] == INVALID_HANDLE_VALUE)
50515088
{
50525089
EMSG2(_(e_notopen), fname);
50535090
goto failed;
50545091
}
5055-
ifd[0] = (HANDLE)_get_osfhandle(fd);
50565092
}
50575093
else if (!use_null_for_in &&
50585094
(!CreatePipe(&ifd[0], &ifd[1], &saAttr, 0)
@@ -5063,13 +5099,14 @@ mch_start_job(char *cmd, job_T *job, jobopt_T *options)
50635099
{
50645100
char_u *fname = options->jo_io_name[PART_OUT];
50655101

5066-
int fd = mch_open((char *)fname, O_WRONLY | O_CREAT | O_TRUNC, 0644);
5067-
if (fd < 0)
5102+
ofd[1] = job_io_file_open(fname, GENERIC_WRITE,
5103+
FILE_SHARE_READ | FILE_SHARE_WRITE,
5104+
&saAttr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL);
5105+
if (ofd[1] == INVALID_HANDLE_VALUE)
50685106
{
50695107
EMSG2(_(e_notopen), fname);
50705108
goto failed;
50715109
}
5072-
ofd[1] = (HANDLE)_get_osfhandle(fd);
50735110
}
50745111
else if (!use_null_for_out &&
50755112
(!CreatePipe(&ofd[0], &ofd[1], &saAttr, 0)
@@ -5080,13 +5117,14 @@ mch_start_job(char *cmd, job_T *job, jobopt_T *options)
50805117
{
50815118
char_u *fname = options->jo_io_name[PART_ERR];
50825119

5083-
int fd = mch_open((char *)fname, O_WRONLY | O_CREAT | O_TRUNC, 0600);
5084-
if (fd < 0)
5120+
efd[1] = job_io_file_open(fname, GENERIC_WRITE,
5121+
FILE_SHARE_READ | FILE_SHARE_WRITE,
5122+
&saAttr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL);
5123+
if (efd[1] == INVALID_HANDLE_VALUE)
50855124
{
50865125
EMSG2(_(e_notopen), fname);
50875126
goto failed;
50885127
}
5089-
efd[1] = (HANDLE)_get_osfhandle(fd);
50905128
}
50915129
else if (!use_out_for_err && !use_null_for_err &&
50925130
(!CreatePipe(&efd[0], &efd[1], &saAttr, 0)

src/version.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -743,6 +743,8 @@ static char *(features[]) =
743743

744744
static int included_patches[] =
745745
{ /* Add new patch number below this line */
746+
/**/
747+
1532,
746748
/**/
747749
1531,
748750
/**/

0 commit comments

Comments
 (0)