msvcrt: Don't try to duplicate invalid handles. Don't reset std handles if we didn't set them.

This commit is contained in:
Alexandre Julliard 2009-02-18 14:44:17 +01:00
parent 64ae0000b6
commit 1c91d54503

View File

@ -168,7 +168,10 @@ static HANDLE msvcrt_fdtoh(int fd)
/* INTERNAL: free a file entry fd */ /* INTERNAL: free a file entry fd */
static void msvcrt_free_fd(int fd) static void msvcrt_free_fd(int fd)
{ {
HANDLE old_handle;
LOCK_FILES(); LOCK_FILES();
old_handle = MSVCRT_fdesc[fd].handle;
MSVCRT_fdesc[fd].handle = INVALID_HANDLE_VALUE; MSVCRT_fdesc[fd].handle = INVALID_HANDLE_VALUE;
MSVCRT_fdesc[fd].wxflag = 0; MSVCRT_fdesc[fd].wxflag = 0;
TRACE(":fd (%d) freed\n",fd); TRACE(":fd (%d) freed\n",fd);
@ -176,9 +179,15 @@ static void msvcrt_free_fd(int fd)
{ {
switch (fd) switch (fd)
{ {
case 0: SetStdHandle(STD_INPUT_HANDLE, NULL); break; case 0:
case 1: SetStdHandle(STD_OUTPUT_HANDLE, NULL); break; if (GetStdHandle(STD_INPUT_HANDLE) == old_handle) SetStdHandle(STD_INPUT_HANDLE, 0);
case 2: SetStdHandle(STD_ERROR_HANDLE, NULL); break; break;
case 1:
if (GetStdHandle(STD_OUTPUT_HANDLE) == old_handle) SetStdHandle(STD_OUTPUT_HANDLE, 0);
break;
case 2:
if (GetStdHandle(STD_ERROR_HANDLE) == old_handle) SetStdHandle(STD_ERROR_HANDLE, 0);
break;
} }
} }
else else
@ -361,24 +370,27 @@ void msvcrt_init_io(void)
if (!(MSVCRT_fdesc[0].wxflag & WX_OPEN) || MSVCRT_fdesc[0].handle == INVALID_HANDLE_VALUE) if (!(MSVCRT_fdesc[0].wxflag & WX_OPEN) || MSVCRT_fdesc[0].handle == INVALID_HANDLE_VALUE)
{ {
DuplicateHandle(GetCurrentProcess(), GetStdHandle(STD_INPUT_HANDLE), HANDLE std = GetStdHandle(STD_INPUT_HANDLE);
GetCurrentProcess(), &MSVCRT_fdesc[0].handle, 0, TRUE, if (std != INVALID_HANDLE_VALUE && DuplicateHandle(GetCurrentProcess(), std,
DUPLICATE_SAME_ACCESS); GetCurrentProcess(), &MSVCRT_fdesc[0].handle,
MSVCRT_fdesc[0].wxflag = WX_OPEN | WX_TEXT; 0, TRUE, DUPLICATE_SAME_ACCESS))
MSVCRT_fdesc[0].wxflag = WX_OPEN | WX_TEXT;
} }
if (!(MSVCRT_fdesc[1].wxflag & WX_OPEN) || MSVCRT_fdesc[1].handle == INVALID_HANDLE_VALUE) if (!(MSVCRT_fdesc[1].wxflag & WX_OPEN) || MSVCRT_fdesc[1].handle == INVALID_HANDLE_VALUE)
{ {
DuplicateHandle(GetCurrentProcess(), GetStdHandle(STD_OUTPUT_HANDLE), HANDLE std = GetStdHandle(STD_OUTPUT_HANDLE);
GetCurrentProcess(), &MSVCRT_fdesc[1].handle, 0, TRUE, if (std != INVALID_HANDLE_VALUE && DuplicateHandle(GetCurrentProcess(), std,
DUPLICATE_SAME_ACCESS); GetCurrentProcess(), &MSVCRT_fdesc[1].handle,
MSVCRT_fdesc[1].wxflag = WX_OPEN | WX_TEXT; 0, TRUE, DUPLICATE_SAME_ACCESS))
MSVCRT_fdesc[1].wxflag = WX_OPEN | WX_TEXT;
} }
if (!(MSVCRT_fdesc[2].wxflag & WX_OPEN) || MSVCRT_fdesc[2].handle == INVALID_HANDLE_VALUE) if (!(MSVCRT_fdesc[2].wxflag & WX_OPEN) || MSVCRT_fdesc[2].handle == INVALID_HANDLE_VALUE)
{ {
DuplicateHandle(GetCurrentProcess(), GetStdHandle(STD_ERROR_HANDLE), HANDLE std = GetStdHandle(STD_ERROR_HANDLE);
GetCurrentProcess(), &MSVCRT_fdesc[2].handle, 0, TRUE, if (std != INVALID_HANDLE_VALUE && DuplicateHandle(GetCurrentProcess(), std,
DUPLICATE_SAME_ACCESS); GetCurrentProcess(), &MSVCRT_fdesc[2].handle,
MSVCRT_fdesc[2].wxflag = WX_OPEN | WX_TEXT; 0, TRUE, DUPLICATE_SAME_ACCESS))
MSVCRT_fdesc[2].wxflag = WX_OPEN | WX_TEXT;
} }
TRACE(":handles (%p)(%p)(%p)\n",MSVCRT_fdesc[0].handle, TRACE(":handles (%p)(%p)(%p)\n",MSVCRT_fdesc[0].handle,