From 28fefca765bd0524bcc5a463e990425c82cd0f46 Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Thu, 17 Apr 2025 09:21:28 -0500 Subject: [PATCH] [bug] Windows-to-Linux remote mount overlapped I/O is not detecting EOF for read operations #48 --- repertory/librepertory/include/common.hpp | 1 + .../src/drives/fuse/remotefuse/remote_server.cpp | 10 +++------- .../repertory_test/src/winfsp_drive_rdrw_test.cpp | 2 -- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/repertory/librepertory/include/common.hpp b/repertory/librepertory/include/common.hpp index 9d7ff1f0..2ba34922 100644 --- a/repertory/librepertory/include/common.hpp +++ b/repertory/librepertory/include/common.hpp @@ -226,6 +226,7 @@ using WCHAR = wchar_t; #define STATUS_DEVICE_BUSY std::uint32_t{0x80000011L} #define STATUS_DEVICE_INSUFFICIENT_RESOURCES std::uint32_t{0xC0000468L} #define STATUS_DIRECTORY_NOT_EMPTY std::uint32_t{0xC0000101L} +#define STATUS_END_OF_FILE std::uint32_t{0xC0000011L}; #define STATUS_FILE_IS_A_DIRECTORY std::uint32_t{0xC00000BAL} #define STATUS_FILE_TOO_LARGE std::uint32_t{0xC0000904L} #define STATUS_INSUFFICIENT_RESOURCES std::uint32_t{0xC000009AL} diff --git a/repertory/librepertory/src/drives/fuse/remotefuse/remote_server.cpp b/repertory/librepertory/src/drives/fuse/remotefuse/remote_server.cpp index c5486e3d..8904ff30 100644 --- a/repertory/librepertory/src/drives/fuse/remotefuse/remote_server.cpp +++ b/repertory/librepertory/src/drives/fuse/remotefuse/remote_server.cpp @@ -28,7 +28,6 @@ #include "drives/directory_iterator.hpp" #include "drives/remote/remote_open_file_table.hpp" #include "events/event_system.hpp" -#include "events/types/debug_log.hpp" #include "events/types/remote_server_event.hpp" #include "platform/platform.hpp" #include "types/remote.hpp" @@ -1379,18 +1378,15 @@ auto remote_server::winfsp_read(PVOID file_desc, PVOID buffer, UINT64 offset, if (ret == STATUS_SUCCESS) { auto res = pread64(static_cast(handle), buffer, length, static_cast(offset)); - event_system::instance().raise( - function_name, - fmt::format("read|offset|{}|len|{}|res|{}", offset, length, res)); if (res >= 0) { *bytes_transferred = static_cast(res); + if (*bytes_transferred == 0U) { + ret = STATUS_END_OF_FILE; + } } else { ret = static_cast(utils::unix_error_to_windows(errno)); } - event_system::instance().raise( - function_name, fmt::format("read|offset|{}|len|{}|res|{}|tx|{}", offset, - length, res, *bytes_transferred)); } RAISE_REMOTE_FUSE_SERVER_EVENT( diff --git a/repertory/repertory_test/src/winfsp_drive_rdrw_test.cpp b/repertory/repertory_test/src/winfsp_drive_rdrw_test.cpp index 6d3fd6c7..98a03513 100644 --- a/repertory/repertory_test/src/winfsp_drive_rdrw_test.cpp +++ b/repertory/repertory_test/src/winfsp_drive_rdrw_test.cpp @@ -342,8 +342,6 @@ static void test_overlapped_file(auto &&mount_location, auto &&file_path, overlapped.Offset = 3U * bytes_per_sector; ret = ::ReadFile(handle, read_buffer.data(), bytes_per_sector, &bytes_read, &overlapped); - fmt::println("size|{}|offset|{}|read|{}|ret|{}|err|{}", size.QuadPart, - overlapped.Offset, bytes_read, ret, ::GetLastError()); EXPECT_TRUE(ret || ERROR_IO_PENDING == ::GetLastError() || ERROR_HANDLE_EOF == ::GetLastError()); if (ERROR_HANDLE_EOF != ::GetLastError()) {