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 3012a49c..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 > 1020) + if (SizeA > 255 * 4) { fsp_fuse_intf_LogBadDirInfo(filedesc->PosixPath, name, "too long"); @@ -2000,7 +2000,7 @@ static NTSTATUS fsp_fuse_intf_FixDirInfo(FSP_FILE_SYSTEM *FileSystem, NTSTATUS Result; SizeA = lstrlenA(filedesc->PosixPath); - PosixPath = MemAlloc(SizeA + 1 + 1020 + 1); + PosixPath = MemAlloc(SizeA + 1 + 255 * 4 + 1); if (0 == PosixPath) { Result = STATUS_INSUFFICIENT_RESOURCES; @@ -2049,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, 1020, 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); }