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) {