From ff746a7bece77f7feb00e2c869522f4e5acb3134 Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Fri, 4 Apr 2025 17:33:51 -0500 Subject: [PATCH] [bug] Windows-to-Linux remote mount ignores CREATE_NEW #44 --- .../winfsp/remotewinfsp/remote_client.cpp | 2 -- .../winfsp/remotewinfsp/remote_server.cpp | 2 +- .../remotewinfsp/remote_winfsp_drive.cpp | 34 ++++++++++++------- 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/repertory/librepertory/src/drives/winfsp/remotewinfsp/remote_client.cpp b/repertory/librepertory/src/drives/winfsp/remotewinfsp/remote_client.cpp index 1ff69a07..3746efce 100644 --- a/repertory/librepertory/src/drives/winfsp/remotewinfsp/remote_client.cpp +++ b/repertory/librepertory/src/drives/winfsp/remotewinfsp/remote_client.cpp @@ -188,8 +188,6 @@ auto remote_client::winfsp_create(PWSTR file_name, UINT32 create_options, DECODE_OR_IGNORE(&response, normalized_name); DECODE_OR_IGNORE(&response, exists); - fmt::println("{}|{}", exists, ret); - if (exists == 0U) { *file_desc = reinterpret_cast(handle); set_open_info(to_handle(*file_desc), diff --git a/repertory/librepertory/src/drives/winfsp/remotewinfsp/remote_server.cpp b/repertory/librepertory/src/drives/winfsp/remotewinfsp/remote_server.cpp index c0cac798..55b63269 100644 --- a/repertory/librepertory/src/drives/winfsp/remotewinfsp/remote_server.cpp +++ b/repertory/librepertory/src/drives/winfsp/remotewinfsp/remote_server.cpp @@ -1061,7 +1061,7 @@ auto remote_server::winfsp_get_security_by_name(PWSTR file_name, auto file_path = utils::string::from_utf8(utils::path::combine( mount_location_, {utils::string::to_utf8(file_name)})); - auto ret = STATUS_BUFFER_OVERFLOW; + auto ret{STATUS_BUFFER_OVERFLOW}; if ((descriptor_size == nullptr) || (*descriptor_size <= std::numeric_limits::max())) { auto *descriptor = descriptor_size == nullptr diff --git a/repertory/librepertory/src/drives/winfsp/remotewinfsp/remote_winfsp_drive.cpp b/repertory/librepertory/src/drives/winfsp/remotewinfsp/remote_winfsp_drive.cpp index 1ceb3968..a4d1e100 100644 --- a/repertory/librepertory/src/drives/winfsp/remotewinfsp/remote_winfsp_drive.cpp +++ b/repertory/librepertory/src/drives/winfsp/remotewinfsp/remote_winfsp_drive.cpp @@ -168,24 +168,32 @@ auto remote_winfsp_drive::GetSecurityByName(PWSTR file_name, PUINT32 attributes, PSECURITY_DESCRIPTOR descriptor, SIZE_T *descriptor_size) -> NTSTATUS { + std::uint64_t sds{ + (descriptor_size == nullptr) ? 0U : *descriptor_size, + }; + std::wstring string_descriptor; - std::uint64_t sds = (descriptor_size == nullptr) ? 0 : *descriptor_size; - auto ret = remote_instance_->winfsp_get_security_by_name( - file_name, attributes, descriptor_size ? &sds : nullptr, - string_descriptor); - *descriptor_size = static_cast(sds); - if ((ret == STATUS_SUCCESS) && *descriptor_size) { - PSECURITY_DESCRIPTOR sd{nullptr}; - ULONG sz2{0U}; + auto ret{ + remote_instance_->winfsp_get_security_by_name( + file_name, attributes, descriptor_size ? &sds : nullptr, + string_descriptor), + }; + + if ((ret == STATUS_SUCCESS) && (descriptor_size != nullptr)) { + *descriptor_size = static_cast(sds); + + PSECURITY_DESCRIPTOR desc{nullptr}; + ULONG size{0U}; if (::ConvertStringSecurityDescriptorToSecurityDescriptorW( - string_descriptor.data(), SDDL_REVISION_1, &sd, &sz2)) { - if (sz2 > *descriptor_size) { + string_descriptor.data(), SDDL_REVISION_1, &desc, &size)) { + if (size > *descriptor_size) { ret = STATUS_BUFFER_TOO_SMALL; } else { - ::CopyMemory(descriptor, sd, sz2); + ::CopyMemory(descriptor, desc, size); } - *descriptor_size = sz2; - ::LocalFree(sd); + + *descriptor_size = size; + ::LocalFree(desc); } else { ret = FspNtStatusFromWin32(::GetLastError()); }