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