diff --git a/src/dll/fsop.c b/src/dll/fsop.c index 3ef2827d..dcb0bdef 100644 --- a/src/dll/fsop.c +++ b/src/dll/fsop.c @@ -664,25 +664,27 @@ FSP_API BOOLEAN FspFileSystemAddDirInfo(FSP_FSCTL_DIR_INFO *DirInfo, static UINT8 Zero[sizeof DirInfo->Size] = { 0 }; PVOID BufferEnd = (PUINT8)Buffer + Length; PVOID SrcBuffer; - ULONG SrcLength; + ULONG SrcLength, DstLength; if (0 != DirInfo) { SrcBuffer = DirInfo; - SrcLength = sizeof DirInfo->Size; + SrcLength = DirInfo->Size; + DstLength = FSP_FSCTL_DEFAULT_ALIGN_UP(SrcLength); } else { SrcBuffer = &Zero; SrcLength = sizeof Zero; + DstLength = SrcLength; } Buffer = (PVOID)((PUINT8)Buffer + *PBytesTransferred); - if ((PUINT8)Buffer + SrcLength > (PUINT8)BufferEnd) + if ((PUINT8)Buffer + DstLength > (PUINT8)BufferEnd) return FALSE; memcpy(Buffer, SrcBuffer, SrcLength); - *PBytesTransferred += SrcLength; + *PBytesTransferred += DstLength; return TRUE; } diff --git a/tst/winfsp-tests/memfs.cpp b/tst/winfsp-tests/memfs.cpp index 382824ab..7ea5dcc4 100644 --- a/tst/winfsp-tests/memfs.cpp +++ b/tst/winfsp-tests/memfs.cpp @@ -206,12 +206,15 @@ BOOLEAN MemfsFileNodeEnumerateChildren(MEMFS_FILE_NODE_MAP *FileNodeMap, MEMFS_F WCHAR Root[2] = L"\\"; PWSTR Remain, Suffix; MEMFS_FILE_NODE_MAP::iterator iter = FileNodeMap->upper_bound(FileNode->FileName); + BOOLEAN Equal; for (; FileNodeMap->end() != iter; ++iter) { if (!MemfsFileNameHasPrefix(iter->second->FileName, FileNode->FileName)) break; FspPathSuffix(iter->second->FileName, &Remain, &Suffix, Root); - if (0 == MemfsFileNameCompare(Remain, FileNode->FileName)) + Equal = 0 == MemfsFileNameCompare(Remain, FileNode->FileName); + FspPathCombine(iter->second->FileName, Suffix); + if (Equal) { if (!EnumFn(iter->second, Context)) return FALSE; @@ -697,22 +700,39 @@ typedef struct _MEMFS_READ_DIRECTORY_CONTEXT PULONG PBytesTransferred; } MEMFS_READ_DIRECTORY_CONTEXT; +static BOOLEAN AddDirInfo(MEMFS_FILE_NODE *FileNode, PWSTR FileName, + PVOID Buffer, ULONG Length, PULONG PBytesTransferred) +{ + UINT8 DirInfoBuf[sizeof(FSP_FSCTL_DIR_INFO) + sizeof FileNode->FileName]; + FSP_FSCTL_DIR_INFO *DirInfo = (FSP_FSCTL_DIR_INFO *)DirInfoBuf; + WCHAR Root[2] = L"\\"; + PWSTR Remain, Suffix; + + if (0 == FileName) + { + FspPathSuffix(FileNode->FileName, &Remain, &Suffix, Root); + FileName = Suffix; + FspPathCombine(FileNode->FileName, Suffix); + } + + memset(DirInfo->Padding, 0, sizeof DirInfo->Padding); + DirInfo->Size = (UINT16)(sizeof(FSP_FSCTL_DIR_INFO) + wcslen(FileName) * sizeof(WCHAR)); + DirInfo->FileInfo = FileNode->FileInfo; + DirInfo->NextOffset = FileNode->FileInfo.IndexNumber; + memcpy(DirInfo->FileNameBuf, FileName, DirInfo->Size - sizeof(FSP_FSCTL_DIR_INFO)); + + return FspFileSystemAddDirInfo(DirInfo, Buffer, Length, PBytesTransferred); +} + static BOOLEAN ReadDirectoryEnumFn(MEMFS_FILE_NODE *FileNode, PVOID Context0) { MEMFS_READ_DIRECTORY_CONTEXT *Context = (MEMFS_READ_DIRECTORY_CONTEXT *)Context0; - UINT8 DirInfoBuf[sizeof(FSP_FSCTL_DIR_INFO) + sizeof FileNode->FileName]; - FSP_FSCTL_DIR_INFO *DirInfo = (FSP_FSCTL_DIR_INFO *)DirInfoBuf; - if (0 == *Context->PBytesTransferred && Context->Offset != FileNode->FileInfo.IndexNumber) + if (0 == *Context->PBytesTransferred && + 0 != Context->Offset && Context->Offset != FileNode->FileInfo.IndexNumber) return TRUE; - memset(DirInfo->Padding, 0, sizeof DirInfo->Padding); - DirInfo->Size = (UINT16)(sizeof(FSP_FSCTL_DIR_INFO) + wcslen(FileNode->FileName) * sizeof(WCHAR)); - DirInfo->FileInfo = FileNode->FileInfo; - DirInfo->NextOffset = FileNode->FileInfo.IndexNumber; - memcpy(DirInfo->FileNameBuf, FileNode->FileName, DirInfo->Size - sizeof(FSP_FSCTL_DIR_INFO)); - - return FspFileSystemAddDirInfo(DirInfo, + return AddDirInfo(FileNode, 0, Context->Buffer, Context->Length, Context->PBytesTransferred); } @@ -731,20 +751,18 @@ static NTSTATUS ReadDirectory(FSP_FILE_SYSTEM *FileSystem, if (0 == ParentNode) return Result; + if (0 == Offset) + if (!AddDirInfo(FileNode, L".", Buffer, Length, PBytesTransferred)) + return STATUS_SUCCESS; + if (0 == Offset || FileNode->FileInfo.IndexNumber == Offset) + if (!AddDirInfo(ParentNode, L"..", Buffer, Length, PBytesTransferred)) + return STATUS_SUCCESS; + Context.Buffer = Buffer; Context.Offset = Offset; Context.Length = Length; Context.PBytesTransferred = PBytesTransferred; - if (0 == Offset) - /* "." */ - if (!ReadDirectoryEnumFn(FileNode, &Context)) - return STATUS_SUCCESS; - if (0 == Offset || FileNode->FileInfo.IndexNumber == Offset) - /* ".." */ - if (!ReadDirectoryEnumFn(ParentNode, &Context)) - return STATUS_SUCCESS; - if (MemfsFileNodeEnumerateChildren(Memfs->FileNodeMap, FileNode, ReadDirectoryEnumFn, &Context)) FspFileSystemAddDirInfo(0, Buffer, Length, PBytesTransferred);