tst: memfs: Cleanup: remove all named streams on delete

This commit is contained in:
Bill Zissimopoulos 2016-09-28 17:11:30 -07:00
parent b591015b28
commit 5c3a82a074

View File

@ -518,11 +518,18 @@ NTSTATUS Overwrite(FSP_FILE_SYSTEM *FileSystem,
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
typedef struct _MEMFS_CLEANUP_CONTEXT
{
MEMFS_FILE_NODE **FileNodes;
ULONG Count;
} MEMFS_CLEANUP_CONTEXT;
static BOOLEAN CleanupEnumFn(MEMFS_FILE_NODE *FileNode, PVOID Context0) static BOOLEAN CleanupEnumFn(MEMFS_FILE_NODE *FileNode, PVOID Context0)
{ {
MEMFS *Memfs = (MEMFS *)Context0; MEMFS_CLEANUP_CONTEXT *Context = (MEMFS_CLEANUP_CONTEXT *)Context0;
Context->FileNodes[Context->Count++] = FileNode;
MemfsFileNodeMapRemove(Memfs->FileNodeMap, FileNode);
return TRUE; return TRUE;
} }
@ -538,7 +545,18 @@ static VOID Cleanup(FSP_FILE_SYSTEM *FileSystem,
if (Delete && !MemfsFileNodeMapHasChild(Memfs->FileNodeMap, FileNode)) if (Delete && !MemfsFileNodeMapHasChild(Memfs->FileNodeMap, FileNode))
{ {
MemfsFileNodeMapEnumerateNamedStreams(Memfs->FileNodeMap, FileNode, CleanupEnumFn, Memfs); MEMFS_CLEANUP_CONTEXT Context = { 0 };
ULONG Index;
Context.FileNodes = (MEMFS_FILE_NODE **)malloc(Memfs->MaxFileNodes * sizeof Context.FileNodes[0]);
if (0 != Context.FileNodes)
{
MemfsFileNodeMapEnumerateNamedStreams(Memfs->FileNodeMap, FileNode, CleanupEnumFn, &Context);
for (Index = 0; Context.Count > Index; Index++)
MemfsFileNodeMapRemove(Memfs->FileNodeMap, Context.FileNodes[Index]);
free(Context.FileNodes);
}
MemfsFileNodeMapRemove(Memfs->FileNodeMap, FileNode); MemfsFileNodeMapRemove(Memfs->FileNodeMap, FileNode);
} }
} }