diff --git a/ext/test b/ext/test index 9fe81b89..60f9f44b 160000 --- a/ext/test +++ b/ext/test @@ -1 +1 @@ -Subproject commit 9fe81b891b950beb81badaaba7b8fb8ab1ad92e3 +Subproject commit 60f9f44b8773122bc3873b162b4136d57f60a131 diff --git a/src/sys/create.c b/src/sys/create.c index 9f2a43d5..6845709d 100644 --- a/src/sys/create.c +++ b/src/sys/create.c @@ -269,15 +269,21 @@ static NTSTATUS FspFsvolCreateNoLock( if (0 == RelatedFileObject && 0 < FsvolDeviceExtension->VolumePrefix.Length) { if (!FspFsvolDeviceVolumePrefixInString(FsvolDeviceObject, &FileNode->FileName) || - '\\' != FileNode->FileName.Buffer[FsvolDeviceExtension->VolumePrefix.Length / sizeof(WCHAR)]) + (FileNode->FileName.Length > FsvolDeviceExtension->VolumePrefix.Length && + '\\' != FileNode->FileName.Buffer[FsvolDeviceExtension->VolumePrefix.Length / sizeof(WCHAR)])) { FspFileNodeDereference(FileNode); return STATUS_OBJECT_PATH_NOT_FOUND; } - FileNode->FileName.Length -= FsvolDeviceExtension->VolumePrefix.Length; - FileNode->FileName.MaximumLength -= FsvolDeviceExtension->VolumePrefix.Length; - FileNode->FileName.Buffer += FsvolDeviceExtension->VolumePrefix.Length / sizeof(WCHAR); + if (FileNode->FileName.Length > FsvolDeviceExtension->VolumePrefix.Length) + { + FileNode->FileName.Length -= FsvolDeviceExtension->VolumePrefix.Length; + FileNode->FileName.MaximumLength -= FsvolDeviceExtension->VolumePrefix.Length; + FileNode->FileName.Buffer += FsvolDeviceExtension->VolumePrefix.Length / sizeof(WCHAR); + } + else + FileNode->FileName.Length = sizeof(WCHAR); } ASSERT(sizeof(WCHAR) <= FileNode->FileName.Length && L'\\' == FileNode->FileName.Buffer[0]); diff --git a/tst/winfsp-tests/create-test.c b/tst/winfsp-tests/create-test.c index fee2bd60..e6d8735e 100644 --- a/tst/winfsp-tests/create-test.c +++ b/tst/winfsp-tests/create-test.c @@ -424,10 +424,48 @@ void create_share_test(void) create_share_dotest(MemfsNet, L"\\\\memfs\\share"); } +void create_curdir_dotest(ULONG Flags, PWSTR Prefix) +{ + void *memfs = memfs_start(Flags); + + WCHAR CurrentDirectory[MAX_PATH], FilePath[MAX_PATH]; + BOOL Success; + + StringCbPrintfW(FilePath, sizeof FilePath, L"%s%s%s", + Prefix ? L"" : L"\\\\?\\GLOBALROOT", Prefix ? Prefix : memfs_volumename(memfs), + Prefix ? L"" : L"\\"); + + Success = GetCurrentDirectoryW(MAX_PATH, CurrentDirectory); + ASSERT(Success); + + Success = SetCurrentDirectoryW(FilePath); + ASSERT(Success); + + Success = SetCurrentDirectoryW(CurrentDirectory); + ASSERT(Success); + + memfs_stop(memfs); +} + +void create_curdir_test(void) +{ + if (NtfsTests) + { + WCHAR DirBuf[MAX_PATH] = L"\\\\?\\"; + GetCurrentDirectoryW(MAX_PATH - 4, DirBuf + 4); + create_curdir_dotest(-1, DirBuf); + } + if (WinFspDiskTests) + create_curdir_dotest(MemfsDisk, 0); + if (WinFspNetTests) + create_curdir_dotest(MemfsNet, L"\\\\memfs\\share"); +} + void create_tests(void) { TEST(create_test); TEST(create_related_test); TEST(create_sd_test); TEST(create_share_test); + TEST(create_curdir_test); }