From 35212f7bef17d0364936c3fefe64d523973569f6 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Sun, 26 Mar 2023 12:03:29 +1100 Subject: [PATCH] userlandfs: Fix GetVNodeName - VNode names are now allowed to have a length of 1. This is common for Windows drives mounted through a shared filesystem. - Empty VNode names are now checked from the userland side, preventing the kernel driver to reject and not ACK a false B_OK from the userland server. Change-Id: If0a6fcea1387367d1492c9b94c62c03e381ce1c1 Reviewed-on: https://review.haiku-os.org/c/haiku/+/6276 Reviewed-by: waddlesplash Tested-by: Automation Reviewed-by: Adrien Destugues --- .../kernel/file_systems/userlandfs/kernel_add_on/Volume.cpp | 2 +- .../kernel/file_systems/userlandfs/server/fuse/FUSEVolume.cpp | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/add-ons/kernel/file_systems/userlandfs/kernel_add_on/Volume.cpp b/src/add-ons/kernel/file_systems/userlandfs/kernel_add_on/Volume.cpp index 770752e964..f31966accd 100644 --- a/src/add-ons/kernel/file_systems/userlandfs/kernel_add_on/Volume.cpp +++ b/src/add-ons/kernel/file_systems/userlandfs/kernel_add_on/Volume.cpp @@ -1045,7 +1045,7 @@ Volume::GetVNodeName(void* _node, char* buffer, size_t bufferSize) char* readBuffer = (char*)reply->buffer.GetData(); size_t nameLen = reply->buffer.GetSize(); nameLen = strnlen(readBuffer, nameLen); - if (nameLen <= 1 || nameLen >= bufferSize) + if (nameLen <= 0 || nameLen >= bufferSize) RETURN_ERROR(B_BAD_DATA); memcpy(buffer, readBuffer, nameLen); diff --git a/src/add-ons/kernel/file_systems/userlandfs/server/fuse/FUSEVolume.cpp b/src/add-ons/kernel/file_systems/userlandfs/server/fuse/FUSEVolume.cpp index 9709820791..fa182ef37f 100644 --- a/src/add-ons/kernel/file_systems/userlandfs/server/fuse/FUSEVolume.cpp +++ b/src/add-ons/kernel/file_systems/userlandfs/server/fuse/FUSEVolume.cpp @@ -959,6 +959,9 @@ FUSEVolume::GetVNodeName(void* _node, char* buffer, size_t bufferSize) if (entry == NULL) RETURN_ERROR(B_ENTRY_NOT_FOUND); + if (entry->name == NULL || entry->name[0] == '\0') + RETURN_ERROR(B_BAD_DATA); + if (strlcpy(buffer, entry->name, bufferSize) >= bufferSize) RETURN_ERROR(B_NAME_TOO_LONG);