Piotr Caban : msvcrt: Fix write() behaviour on "no console" file descriptors.
Alexandre Julliard
julliard at winehq.org
Wed Nov 15 16:46:00 CST 2017
Module: wine
Branch: master
Commit: 7aa4b6d17023061feff50ca33c440b9590511e2d
URL: http://source.winehq.org/git/wine.git/?a=commit;h=7aa4b6d17023061feff50ca33c440b9590511e2d
Author: Piotr Caban <piotr at codeweavers.com>
Date: Wed Nov 15 09:47:37 2017 +0100
msvcrt: Fix write() behaviour on "no console" file descriptors.
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/msvcrt/file.c | 11 ++++++-----
dlls/msvcrt/tests/file.c | 20 ++++++++++++++++++++
2 files changed, 26 insertions(+), 5 deletions(-)
diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c
index 7fcba06..5eaee2b 100644
--- a/dlls/msvcrt/file.c
+++ b/dlls/msvcrt/file.c
@@ -3423,7 +3423,7 @@ int CDECL MSVCRT__write(int fd, const void* buf, unsigned int count)
if (count > 32)
TRACE(":fd (%d) handle (%d) buf (%p) len (%d)\n",fd,hand,buf,count);
#endif
- if (hand == INVALID_HANDLE_VALUE)
+ if (hand == INVALID_HANDLE_VALUE || fd == MSVCRT_NO_CONSOLE_FD)
{
*MSVCRT__errno() = MSVCRT_EBADF;
release_ioinfo(info);
@@ -3451,14 +3451,14 @@ int CDECL MSVCRT__write(int fd, const void* buf, unsigned int count)
}
TRACE("WriteFile (fd %d, hand %p) failed-last error (%d)\n", fd,
hand, GetLastError());
- *MSVCRT__errno() = MSVCRT_ENOSPC;
+ msvcrt_set_errno(GetLastError());
}
else
{
unsigned int i, j, nr_lf, size;
char *p = NULL;
const char *q;
- const char *s = buf, *buf_start = buf;
+ const char *s = buf;
if (!(info->exflag & (EF_UTF8|EF_UTF16)))
{
@@ -3577,8 +3577,8 @@ int CDECL MSVCRT__write(int fd, const void* buf, unsigned int count)
{
TRACE("WriteFile (fd %d, hand %p) failed-last error (%d), num_written %d\n",
fd, hand, GetLastError(), num_written);
- *MSVCRT__errno() = MSVCRT_ENOSPC;
- return s - buf_start;
+ msvcrt_set_errno(GetLastError());
+ return -1;
}
return count;
}
@@ -3927,6 +3927,7 @@ int CDECL MSVCRT__flsbuf(int c, MSVCRT_FILE* file)
if(!(file->_flag & MSVCRT__IOWRT)) {
if(!(file->_flag & MSVCRT__IORW)) {
file->_flag |= MSVCRT__IOERR;
+ *MSVCRT__errno() = MSVCRT_EBADF;
return MSVCRT_EOF;
}
file->_flag |= MSVCRT__IOWRT;
diff --git a/dlls/msvcrt/tests/file.c b/dlls/msvcrt/tests/file.c
index f118ef3..99ceb97 100644
--- a/dlls/msvcrt/tests/file.c
+++ b/dlls/msvcrt/tests/file.c
@@ -1557,6 +1557,26 @@ static void test_invalid_stdin_child( void )
ok(errno == EBADF, "errno = %d\n", errno);
errno = 0xdeadbeef;
+ ret = _flsbuf('a', stdin);
+ ok(ret == EOF, "_flsbuf(stdin) returned %d\n", ret);
+ ok(errno == EBADF, "errno = %d\n", errno);
+
+ errno = 0xdeadbeef;
+ ret = fwrite(&c, 1, 1, stdin);
+ ok(!ret, "fwrite(stdin) returned %d\n", ret);
+ ok(errno == EBADF, "errno = %d\n", errno);
+
+ errno = 0xdeadbeef;
+ ret = write(-2, &c, 1);
+ ok(ret == -1, "write(-2) returned %d\n", ret);
+ ok(errno == EBADF, "errno = %d\n", errno);
+
+ errno = 0xdeadbeef;
+ ret = write(STDIN_FILENO, &c, 1);
+ ok(ret == -1, "write(STDIN_FILENO) returned %d\n", ret);
+ ok(errno == EBADF, "errno = %d\n", errno);
+
+ errno = 0xdeadbeef;
ret = fclose(stdin);
ok(ret == -1, "fclose(stdin) returned %d\n", ret);
ok(errno == EBADF, "errno = %d\n", errno);
More information about the wine-cvs
mailing list