From e4b4e6a1f99e35f41006f6a3d1f05e0b4a1c884b Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Thu, 29 Dec 2016 13:16:11 -0800 Subject: [PATCH] sys: FSP_FILE_NODE::MainFileNode: reference/dereference on create/delete --- src/sys/create.c | 2 ++ src/sys/driver.h | 2 +- src/sys/file.c | 3 +++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/sys/create.c b/src/sys/create.c index b45ae50e..a4d3372e 100644 --- a/src/sys/create.c +++ b/src/sys/create.c @@ -444,7 +444,9 @@ static NTSTATUS FspFsvolCreateNoLock( FileAttributes = 0; /* remember the main file node */ + ASSERT(0 == FileNode->MainFileNode); FileNode->MainFileNode = FileDesc->MainFileObject->FsContext; + FspFileNodeReference(FileNode->MainFileNode); Result = STATUS_SUCCESS; diff --git a/src/sys/driver.h b/src/sys/driver.h index 4819f3a4..c3226757 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -1208,7 +1208,7 @@ typedef struct FSP_FILE_NODE UINT64 IndexNumber; BOOLEAN IsDirectory; BOOLEAN IsRootDirectory; - struct FSP_FILE_NODE *MainFileNode; /* this becomes invalid after our last desc close */ + struct FSP_FILE_NODE *MainFileNode; WCHAR FileNameBuf[]; } FSP_FILE_NODE; typedef struct diff --git a/src/sys/file.c b/src/sys/file.c index f75f9d57..8c745594 100644 --- a/src/sys/file.c +++ b/src/sys/file.c @@ -252,6 +252,9 @@ VOID FspFileNodeDelete(FSP_FILE_NODE *FileNode) FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(FileNode->FsvolDeviceObject); + if (0 != FileNode->MainFileNode) + FspFileNodeDereference(FileNode->MainFileNode); + FsRtlUninitializeOplock(FspFileNodeAddrOfOplock(FileNode)); FsRtlUninitializeFileLock(&FileNode->FileLock);