From: Piotr Caban piotr@codeweavers.com
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=53677 --- dlls/msvcrt/file.c | 6 ++++++ dlls/msvcrt/tests/file.c | 7 +++++++ 2 files changed, 13 insertions(+)
diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c index a3140589481..81416deed5a 100644 --- a/dlls/msvcrt/file.c +++ b/dlls/msvcrt/file.c @@ -2756,6 +2756,8 @@ static int read_utf8(ioinfo *fdinfo, wchar_t *buf, unsigned int count) return 0; }else { msvcrt_set_errno(GetLastError()); + if (GetLastError() == ERROR_ACCESS_DENIED) + *_errno() = EBADF; return -1; } }else if(!num_read) { @@ -2813,6 +2815,8 @@ static int read_utf8(ioinfo *fdinfo, wchar_t *buf, unsigned int count) return 0; }else { msvcrt_set_errno(GetLastError()); + if (GetLastError() == ERROR_ACCESS_DENIED) + *_errno() = EBADF; if (readbuf != min_buf) free(readbuf); return -1; } @@ -3041,6 +3045,8 @@ static int read_i(int fd, ioinfo *fdinfo, void *buf, unsigned int count) { TRACE(":failed-last error (%ld)\n", GetLastError()); msvcrt_set_errno(GetLastError()); + if (GetLastError() == ERROR_ACCESS_DENIED) + *_errno() = EBADF; return -1; } } diff --git a/dlls/msvcrt/tests/file.c b/dlls/msvcrt/tests/file.c index 78ed8931d7a..91b057ea72e 100644 --- a/dlls/msvcrt/tests/file.c +++ b/dlls/msvcrt/tests/file.c @@ -258,6 +258,13 @@ static void test_readmode( BOOL ascii_mode ) write (fd, &padbuffer[i], 1); write (fd, nlbuffer, strlen(nlbuffer)); write (fd, outbuffer, sizeof (outbuffer)); + + errno = 0xdeadbeef; + _doserrno = 0xdeadbeef; + ok(read(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); + close (fd);
if (ascii_mode) {
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);