Module: wine Branch: master Commit: 626f8d75e8b525e736c31f1e4f767a26d66c89af URL: https://gitlab.winehq.org/wine/wine/-/commit/626f8d75e8b525e736c31f1e4f767a2...
Author: Eric Pouech epouech@codeweavers.com Date: Thu Aug 17 10:16:37 2023 +0200
msvcrt: Fix freopen() on FILE with invalid underlying fd.
Signed-off-by: Eric Pouech epouech@codeweavers.com
---
dlls/msvcrt/file.c | 4 +--- dlls/msvcrt/tests/file.c | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 3 deletions(-)
diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c index e72784eef41..24d801a5306 100644 --- a/dlls/msvcrt/file.c +++ b/dlls/msvcrt/file.c @@ -4588,9 +4588,7 @@ FILE* CDECL _wfreopen(const wchar_t *path, const wchar_t *mode, FILE* file) TRACE(":path (%s) mode (%s) file (%p) fd (%d)\n", debugstr_w(path), debugstr_w(mode), file, file ? file->_file : -1);
LOCK_FILES(); - if (!file || ((fd = file->_file) < 0)) - file = NULL; - else + if (file) { fclose(file); if (msvcrt_get_flags(mode, &open_flags, &stream_flags) == -1) diff --git a/dlls/msvcrt/tests/file.c b/dlls/msvcrt/tests/file.c index 51ba4225032..15f18a395c8 100644 --- a/dlls/msvcrt/tests/file.c +++ b/dlls/msvcrt/tests/file.c @@ -1236,6 +1236,25 @@ static void test_freopen( void ) ok(ret == EOF, "fclose(file) succeeded\n"); ok(errno == 0xdeadbeef, "errno is %d\n", errno);
+ file = fopen(filename1, "rb"); + ok(file != NULL, "couldn't open %s\n", filename1); + close(file->_file); + file->_file = -1; + + new = freopen(filename2, "rb", file); + ok(new == file, "freopen() didn't return same FILE*\n"); + + fd = fileno(file); + ok(fd > 0, "fileno() returned %d\n", fd); + + ch = '#'; + ret = fread(&ch, 1, 1, file); + ok(ret == 1, "fread() returned %d\n", ret); + ok(ch == '2', "Unexpected char\n"); + + ret = fclose(file); + ok(ret == 0, "fclose(file) returned %d\n", ret); + unlink(filename1); unlink(filename2); }