diff --git a/Contributors.asciidoc b/Contributors.asciidoc index dfef611b..ee52e117 100644 --- a/Contributors.asciidoc +++ b/Contributors.asciidoc @@ -74,4 +74,5 @@ CONTRIBUTOR LIST |Santiago Ganis |sganis at gmail.com |Tobias Urlaub |saibotu at outlook.de |Victor Gao |victgm at outlook.com +|Zeho Huang |zeho11 at protonmail.com |=== diff --git a/src/dll/fuse/fuse_intf.c b/src/dll/fuse/fuse_intf.c index 5ee5d739..287f2e48 100644 --- a/src/dll/fuse/fuse_intf.c +++ b/src/dll/fuse/fuse_intf.c @@ -1939,7 +1939,7 @@ int fsp_fuse_intf_AddDirInfo(void *buf, const char *name, } SizeA = lstrlenA(name); - if (SizeA > 255) + if (SizeA > 255 * 4) { fsp_fuse_intf_LogBadDirInfo(filedesc->PosixPath, name, "too long"); @@ -1953,6 +1953,15 @@ int fsp_fuse_intf_AddDirInfo(void *buf, const char *name, "MultiByteToWideChar failed"); return 0; } + else if (255 == SizeW) + { + if (255 < MultiByteToWideChar(CP_UTF8, 0, name, SizeA, NULL, 0)) + { + fsp_fuse_intf_LogBadDirInfo(filedesc->PosixPath, name, + "too long"); + return 0; + } + } memset(DirInfo, 0, sizeof *DirInfo); DirInfo->Size = (UINT16)(sizeof(FSP_FSCTL_DIR_INFO) + SizeW * sizeof(WCHAR)); @@ -1991,7 +2000,7 @@ static NTSTATUS fsp_fuse_intf_FixDirInfo(FSP_FILE_SYSTEM *FileSystem, NTSTATUS Result; SizeA = lstrlenA(filedesc->PosixPath); - PosixPath = MemAlloc(SizeA + 1 + 255 + 1); + PosixPath = MemAlloc(SizeA + 1 + 255 * 4 + 1); if (0 == PosixPath) { Result = STATUS_INSUFFICIENT_RESOURCES; @@ -2040,7 +2049,7 @@ static NTSTATUS fsp_fuse_intf_FixDirInfo(FSP_FILE_SYSTEM *FileSystem, else { PosixPathEnd = 0; - SizeA = WideCharToMultiByte(CP_UTF8, 0, DirInfo->FileNameBuf, SizeW, PosixName, 255, 0, 0); + SizeA = WideCharToMultiByte(CP_UTF8, 0, DirInfo->FileNameBuf, SizeW, PosixName, 255 * 4, 0, 0); if (0 == SizeA) { /* this should never happen because we just converted using MultiByteToWideChar */ diff --git a/tst/winfsp-tests/create-test.c b/tst/winfsp-tests/create-test.c index e89cb2a3..5e5777e2 100644 --- a/tst/winfsp-tests/create-test.c +++ b/tst/winfsp-tests/create-test.c @@ -1287,6 +1287,38 @@ void create_namelen_dotest(ULONG Flags, PWSTR Prefix, PWSTR Drive) ASSERT(INVALID_HANDLE_VALUE == Handle); ASSERT(ERROR_INVALID_NAME == GetLastError()); + for (P = FilePathBgn, EndP = P + MaxComponentLength - 1; EndP > P; P++) + *P = (P - FilePathBgn) % 10 + 0x3041; + *P = L'\0'; + + Handle = CreateFileW(FilePath, + GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, + CREATE_NEW, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_DELETE_ON_CLOSE, 0); + ASSERT(INVALID_HANDLE_VALUE != Handle); + Success = CloseHandle(Handle); + ASSERT(Success); + + for (P = FilePathBgn, EndP = P + MaxComponentLength; EndP > P; P++) + *P = (P - FilePathBgn) % 10 + 0x3041; + *P = L'\0'; + + Handle = CreateFileW(FilePath, + GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, + CREATE_NEW, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_DELETE_ON_CLOSE, 0); + ASSERT(INVALID_HANDLE_VALUE != Handle); + Success = CloseHandle(Handle); + ASSERT(Success); + + for (P = FilePathBgn, EndP = P + MaxComponentLength + 1; EndP > P; P++) + *P = (P - FilePathBgn) % 10 + 0x3041; + *P = L'\0'; + + Handle = CreateFileW(FilePath, + GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, + CREATE_NEW, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_DELETE_ON_CLOSE, 0); + ASSERT(INVALID_HANDLE_VALUE == Handle); + ASSERT(ERROR_INVALID_NAME == GetLastError()); + memfs_stop(memfs); }