From 249c1a5cb8f9a0549fd553c56ace5dfcd31a12a5 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Wed, 12 Oct 2016 20:08:17 -0700 Subject: [PATCH] sys: FspFsvolDeviceEnumerateContextByName: fix bug that manifested itself as hanging renames --- src/sys/device.c | 11 +++++------ src/sys/driver.h | 7 ++++++- src/sys/file.c | 2 +- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/sys/device.c b/src/sys/device.c index 13540f06..ffff8864 100644 --- a/src/sys/device.c +++ b/src/sys/device.c @@ -47,7 +47,7 @@ NTSTATUS FspFsvolDeviceCopyContextByNameList(PDEVICE_OBJECT DeviceObject, PVOID **PContexts, PULONG PContextCount); VOID FspFsvolDeviceDeleteContextByNameList(PVOID *Contexts, ULONG ContextCount); PVOID FspFsvolDeviceEnumerateContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName, - BOOLEAN SubpathOnly, PVOID *PRestartKey); + BOOLEAN NextFlag, FSP_DEVICE_CONTEXT_BY_NAME_TABLE_RESTART_KEY *RestartKey); PVOID FspFsvolDeviceLookupContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName); PVOID FspFsvolDeviceInsertContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName, PVOID Context, FSP_DEVICE_CONTEXT_BY_NAME_TABLE_ELEMENT *ElementStorage, PBOOLEAN PInserted); @@ -616,20 +616,19 @@ VOID FspFsvolDeviceDeleteContextByNameList(PVOID *Contexts, ULONG ContextCount) } PVOID FspFsvolDeviceEnumerateContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName, - BOOLEAN SubpathOnly, PVOID *PRestartKey) + BOOLEAN NextFlag, FSP_DEVICE_CONTEXT_BY_NAME_TABLE_RESTART_KEY *RestartKey) { PAGED_CODE(); FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(DeviceObject); BOOLEAN CaseInsensitive = 0 == FsvolDeviceExtension->VolumeParams.CaseSensitiveSearch; FSP_DEVICE_CONTEXT_BY_NAME_TABLE_ELEMENT_DATA *Result; - ULONG DeleteCount = 0; - if (0 != *PRestartKey) - SubpathOnly = FALSE; + if (0 != RestartKey->RestartKey) + NextFlag = TRUE; Result = RtlEnumerateGenericTableLikeADirectory(&FsvolDeviceExtension->ContextByNameTable, - 0, 0, SubpathOnly, PRestartKey, &DeleteCount, &FileName); + 0, 0, NextFlag, &RestartKey->RestartKey, &RestartKey->DeleteCount, &FileName); if (0 != Result && RtlPrefixUnicodeString(FileName, Result->FileName, CaseInsensitive) && diff --git a/src/sys/driver.h b/src/sys/driver.h index 69d8b3a1..956b8cba 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -747,6 +747,11 @@ typedef struct RTL_BALANCED_LINKS Header; FSP_DEVICE_CONTEXT_BY_NAME_TABLE_ELEMENT_DATA Data; } FSP_DEVICE_CONTEXT_BY_NAME_TABLE_ELEMENT; +typedef struct +{ + PVOID RestartKey; + ULONG DeleteCount; +} FSP_DEVICE_CONTEXT_BY_NAME_TABLE_RESTART_KEY; enum { FspFsctlDeviceExtensionKind = '\0ltC', /* file system control device (e.g. \Device\WinFsp.Disk) */ @@ -823,7 +828,7 @@ NTSTATUS FspFsvolDeviceCopyContextByNameList(PDEVICE_OBJECT DeviceObject, PVOID **PContexts, PULONG PContextCount); VOID FspFsvolDeviceDeleteContextByNameList(PVOID *Contexts, ULONG ContextCount); PVOID FspFsvolDeviceEnumerateContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName, - BOOLEAN SubpathOnly, PVOID *PRestartKey); + BOOLEAN NextFlag, FSP_DEVICE_CONTEXT_BY_NAME_TABLE_RESTART_KEY *RestartKey); PVOID FspFsvolDeviceLookupContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName); PVOID FspFsvolDeviceInsertContextByName(PDEVICE_OBJECT DeviceObject, PUNICODE_STRING FileName, PVOID Context, FSP_DEVICE_CONTEXT_BY_NAME_TABLE_ELEMENT *ElementStorage, PBOOLEAN PInserted); diff --git a/src/sys/file.c b/src/sys/file.c index 1c8980ac..993787d6 100644 --- a/src/sys/file.c +++ b/src/sys/file.c @@ -835,7 +835,7 @@ BOOLEAN FspFileNodeHasOpenHandles(PDEVICE_OBJECT FsvolDeviceObject, PAGED_CODE(); FSP_FILE_NODE *FileNode; - PVOID RestartKey = 0; + FSP_DEVICE_CONTEXT_BY_NAME_TABLE_RESTART_KEY RestartKey = { 0 }; for (;;) {