From eecca688bca951bbb822461cee1c648e55c30788 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Sun, 1 Jan 2017 12:53:58 -0800 Subject: [PATCH] sys: FspFileNodeInvalidateFileInfo: use after setting/deleting reparse point --- src/sys/driver.h | 1 + src/sys/file.c | 12 ++++++++++++ src/sys/fsctl.c | 6 ++++++ 3 files changed, 19 insertions(+) diff --git a/src/sys/driver.h b/src/sys/driver.h index b522c1d1..7629246f 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -1307,6 +1307,7 @@ VOID FspFileNodeSetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject, const FSP_FSCTL_FILE_INFO *FileInfo, BOOLEAN TruncateOnClose); BOOLEAN FspFileNodeTrySetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject, const FSP_FSCTL_FILE_INFO *FileInfo, ULONG InfoChangeNumber); +VOID FspFileNodeInvalidateFileInfo(FSP_FILE_NODE *FileNode); static inline ULONG FspFileNodeFileInfoChangeNumber(FSP_FILE_NODE *FileNode) { diff --git a/src/sys/file.c b/src/sys/file.c index 78becd7c..2e7a53e5 100644 --- a/src/sys/file.c +++ b/src/sys/file.c @@ -58,6 +58,7 @@ VOID FspFileNodeSetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject, const FSP_FSCTL_FILE_INFO *FileInfo, BOOLEAN TruncateOnClose); BOOLEAN FspFileNodeTrySetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject, const FSP_FSCTL_FILE_INFO *FileInfo, ULONG InfoChangeNumber); +VOID FspFileNodeInvalidateFileInfo(FSP_FILE_NODE *FileNode); BOOLEAN FspFileNodeReferenceSecurity(FSP_FILE_NODE *FileNode, PCVOID *PBuffer, PULONG PSize); VOID FspFileNodeSetSecurity(FSP_FILE_NODE *FileNode, PCVOID Buffer, ULONG Size); BOOLEAN FspFileNodeTrySetSecurity(FSP_FILE_NODE *FileNode, PCVOID Buffer, ULONG Size, @@ -124,6 +125,7 @@ VOID FspFileNodeOplockComplete(PVOID Context, PIRP Irp); #pragma alloc_text(PAGE, FspFileNodeTryGetFileInfo) #pragma alloc_text(PAGE, FspFileNodeSetFileInfo) #pragma alloc_text(PAGE, FspFileNodeTrySetFileInfo) +#pragma alloc_text(PAGE, FspFileNodeInvalidateFileInfo) #pragma alloc_text(PAGE, FspFileNodeReferenceSecurity) #pragma alloc_text(PAGE, FspFileNodeSetSecurity) #pragma alloc_text(PAGE, FspFileNodeTrySetSecurity) @@ -1582,6 +1584,16 @@ BOOLEAN FspFileNodeTrySetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileOb return TRUE; } +VOID FspFileNodeInvalidateFileInfo(FSP_FILE_NODE *FileNode) +{ + PAGED_CODE(); + + FileNode->FileInfoExpirationTime = FileNode->BasicInfoExpirationTime = 0; + + if (0 != FileNode->MainFileNode) + FileNode->MainFileNode->BasicInfoExpirationTime = 0; +} + BOOLEAN FspFileNodeReferenceSecurity(FSP_FILE_NODE *FileNode, PCVOID *PBuffer, PULONG PSize) { PAGED_CODE(); diff --git a/src/sys/fsctl.c b/src/sys/fsctl.c index c5a4b03d..2f99700b 100644 --- a/src/sys/fsctl.c +++ b/src/sys/fsctl.c @@ -300,8 +300,14 @@ static NTSTATUS FspFsvolFileSystemControlReparsePointComplete( if (IsWrite) { PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp); + PFILE_OBJECT FileObject = IrpSp->FileObject; + FSP_FILE_NODE *FileNode = FileObject->FsContext; FSP_FILE_DESC *FileDesc = IrpSp->FileObject->FsContext2; + ASSERT(FileNode == FileDesc->FileNode); + + FspFileNodeInvalidateFileInfo(FileNode); + FileDesc->DidSetReparsePoint = TRUE; FileDesc->DidSetMetadata = TRUE;