From: Piotr Caban piotr@codeweavers.com
--- dlls/msvcrt/file.c | 4 ++++ dlls/msvcrt/tests/file.c | 6 ++++++ 2 files changed, 10 insertions(+)
diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c index 81416deed5a..affa2fbdd43 100644 --- a/dlls/msvcrt/file.c +++ b/dlls/msvcrt/file.c @@ -3590,6 +3590,8 @@ int CDECL _write(int fd, const void* buf, unsigned int count) TRACE("WriteFile (fd %d, hand %p) failed-last error (%ld)\n", fd, hand, GetLastError()); msvcrt_set_errno(GetLastError()); + if (GetLastError() == ERROR_ACCESS_DENIED) + *_errno() = EBADF; num_written = -1; }
@@ -3718,6 +3720,8 @@ int CDECL _write(int fd, const void* buf, unsigned int count) TRACE("WriteFile/WriteConsoleW (fd %d, hand %p) failed-last error (%ld)\n", fd, hand, GetLastError()); msvcrt_set_errno(GetLastError()); + if (GetLastError() == ERROR_ACCESS_DENIED) + *_errno() = EBADF; release_ioinfo(info); return -1; } diff --git a/dlls/msvcrt/tests/file.c b/dlls/msvcrt/tests/file.c index 91b057ea72e..7a5466968b5 100644 --- a/dlls/msvcrt/tests/file.c +++ b/dlls/msvcrt/tests/file.c @@ -311,6 +311,12 @@ static void test_readmode( BOOL ascii_mode ) ok(l == pl+fp,"line 2 ftell got %ld should be %d in %s\n", l, pl+fp, IOMODE); ok(lstrlenA(buffer) == 2+ao,"line 2 fgets got size %d should be %d in %s\n", lstrlenA(buffer), 2+ao, IOMODE); + + errno = 0xdeadbeef; + _doserrno = 0xdeadbeef; + ok(write(fd, buffer, 1) == -1, "read succeeded on write-only file\n"); + ok(errno == EBADF, "errno = %d\n", errno); + ok(_doserrno == ERROR_ACCESS_DENIED, "doserrno = %ld\n", _doserrno);
/* test fread across buffer boundary */ rewind(file);