https://git.reactos.org/?p=reactos.git;a=commitdiff;h=2765bddffa434dc4a6949…
commit 2765bddffa434dc4a6949dfcad8fce85c9564363
Author: Thomas Faber <thomas.faber(a)reactos.org>
AuthorDate: Sun Mar 25 18:34:56 2018 +0200
Commit: Thomas Faber <thomas.faber(a)reactos.org>
CommitDate: Mon Mar 26 13:35:02 2018 +0200
[CRT] Various fixes to Wine file functions.
Import the following Wine commits:
* ea2798f1ce9 Iván Matellanes: msvcrt: _setmode should check if file descriptor is
valid.
* 9b495caacfd Carlo Bramini: msvcrt: Call SetFilePointer() with correct parameters.
* 13f34481b26 Carlo Bramini: msvcrt: Use MSVCRT_xxx macros instead of the same ones
from GLIBC.
* 781b069ed81 Piotr Caban: msvcrt: Don't close HANDLE if stdout or stderr is
sharing it.
---
sdk/lib/crt/stdio/file.c | 15 ++++++++++++++-
1 file changed, 14 insertions(+), 1 deletion(-)
diff --git a/sdk/lib/crt/stdio/file.c b/sdk/lib/crt/stdio/file.c
index b4c66856a3..2357d99bfc 100644
--- a/sdk/lib/crt/stdio/file.c
+++ b/sdk/lib/crt/stdio/file.c
@@ -936,6 +936,14 @@ int CDECL _close(int fd)
TRACE(":fd (%d) handle (%p)\n", fd, info->handle);
if (!(info->wxflag & WX_OPEN)) {
ret = -1;
+ } else if (fd == STDOUT_FILENO &&
+ info->handle == get_ioinfo_nolock(STDERR_FILENO)->handle) {
+ msvcrt_free_fd(fd);
+ ret = 0;
+ } else if (fd == STDERR_FILENO &&
+ info->handle == get_ioinfo_nolock(STDOUT_FILENO)->handle) {
+ msvcrt_free_fd(fd);
+ ret = 0;
} else {
ret = CloseHandle(info->handle) ? 0 : -1;
msvcrt_free_fd(fd);
@@ -1237,7 +1245,7 @@ int CDECL _locking(int fd, int mode, LONG nbytes)
(mode==_LK_NBRLCK)?"_LK_NBRLCK":
"UNKNOWN");
- if ((cur_locn = SetFilePointer(info->handle, 0L, NULL, SEEK_CUR)) ==
INVALID_SET_FILE_POINTER)
+ if ((cur_locn = SetFilePointer(info->handle, 0L, NULL, FILE_CURRENT)) ==
INVALID_SET_FILE_POINTER)
{
release_ioinfo(info);
FIXME ("Seek failed\n");
@@ -2480,6 +2488,11 @@ int CDECL _setmode(int fd,int mode)
return -1;
}
+ if(info == &__badioinfo) {
+ *_errno() = EBADF;
+ return EOF;
+ }
+
if(mode == _O_BINARY) {
info->wxflag &= ~WX_TEXT;
info->exflag &= ~(EF_UTF8|EF_UTF16);