mirror of
				https://github.com/winfsp/winfsp.git
				synced 2025-11-04 04:58:05 -06:00 
			
		
		
		
	sys: FspFileNodeInvalidateFileInfo: use after setting/deleting reparse point
This commit is contained in:
		@@ -1307,6 +1307,7 @@ VOID FspFileNodeSetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject,
 | 
				
			|||||||
    const FSP_FSCTL_FILE_INFO *FileInfo, BOOLEAN TruncateOnClose);
 | 
					    const FSP_FSCTL_FILE_INFO *FileInfo, BOOLEAN TruncateOnClose);
 | 
				
			||||||
BOOLEAN FspFileNodeTrySetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject,
 | 
					BOOLEAN FspFileNodeTrySetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject,
 | 
				
			||||||
    const FSP_FSCTL_FILE_INFO *FileInfo, ULONG InfoChangeNumber);
 | 
					    const FSP_FSCTL_FILE_INFO *FileInfo, ULONG InfoChangeNumber);
 | 
				
			||||||
 | 
					VOID FspFileNodeInvalidateFileInfo(FSP_FILE_NODE *FileNode);
 | 
				
			||||||
static inline
 | 
					static inline
 | 
				
			||||||
ULONG FspFileNodeFileInfoChangeNumber(FSP_FILE_NODE *FileNode)
 | 
					ULONG FspFileNodeFileInfoChangeNumber(FSP_FILE_NODE *FileNode)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -58,6 +58,7 @@ VOID FspFileNodeSetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject,
 | 
				
			|||||||
    const FSP_FSCTL_FILE_INFO *FileInfo, BOOLEAN TruncateOnClose);
 | 
					    const FSP_FSCTL_FILE_INFO *FileInfo, BOOLEAN TruncateOnClose);
 | 
				
			||||||
BOOLEAN FspFileNodeTrySetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject,
 | 
					BOOLEAN FspFileNodeTrySetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject,
 | 
				
			||||||
    const FSP_FSCTL_FILE_INFO *FileInfo, ULONG InfoChangeNumber);
 | 
					    const FSP_FSCTL_FILE_INFO *FileInfo, ULONG InfoChangeNumber);
 | 
				
			||||||
 | 
					VOID FspFileNodeInvalidateFileInfo(FSP_FILE_NODE *FileNode);
 | 
				
			||||||
BOOLEAN FspFileNodeReferenceSecurity(FSP_FILE_NODE *FileNode, PCVOID *PBuffer, PULONG PSize);
 | 
					BOOLEAN FspFileNodeReferenceSecurity(FSP_FILE_NODE *FileNode, PCVOID *PBuffer, PULONG PSize);
 | 
				
			||||||
VOID FspFileNodeSetSecurity(FSP_FILE_NODE *FileNode, PCVOID Buffer, ULONG Size);
 | 
					VOID FspFileNodeSetSecurity(FSP_FILE_NODE *FileNode, PCVOID Buffer, ULONG Size);
 | 
				
			||||||
BOOLEAN FspFileNodeTrySetSecurity(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, FspFileNodeTryGetFileInfo)
 | 
				
			||||||
#pragma alloc_text(PAGE, FspFileNodeSetFileInfo)
 | 
					#pragma alloc_text(PAGE, FspFileNodeSetFileInfo)
 | 
				
			||||||
#pragma alloc_text(PAGE, FspFileNodeTrySetFileInfo)
 | 
					#pragma alloc_text(PAGE, FspFileNodeTrySetFileInfo)
 | 
				
			||||||
 | 
					#pragma alloc_text(PAGE, FspFileNodeInvalidateFileInfo)
 | 
				
			||||||
#pragma alloc_text(PAGE, FspFileNodeReferenceSecurity)
 | 
					#pragma alloc_text(PAGE, FspFileNodeReferenceSecurity)
 | 
				
			||||||
#pragma alloc_text(PAGE, FspFileNodeSetSecurity)
 | 
					#pragma alloc_text(PAGE, FspFileNodeSetSecurity)
 | 
				
			||||||
#pragma alloc_text(PAGE, FspFileNodeTrySetSecurity)
 | 
					#pragma alloc_text(PAGE, FspFileNodeTrySetSecurity)
 | 
				
			||||||
@@ -1582,6 +1584,16 @@ BOOLEAN FspFileNodeTrySetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileOb
 | 
				
			|||||||
    return TRUE;
 | 
					    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)
 | 
					BOOLEAN FspFileNodeReferenceSecurity(FSP_FILE_NODE *FileNode, PCVOID *PBuffer, PULONG PSize)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    PAGED_CODE();
 | 
					    PAGED_CODE();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -300,8 +300,14 @@ static NTSTATUS FspFsvolFileSystemControlReparsePointComplete(
 | 
				
			|||||||
    if (IsWrite)
 | 
					    if (IsWrite)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
 | 
					        PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
 | 
				
			||||||
 | 
					        PFILE_OBJECT FileObject = IrpSp->FileObject;
 | 
				
			||||||
 | 
					        FSP_FILE_NODE *FileNode = FileObject->FsContext;
 | 
				
			||||||
        FSP_FILE_DESC *FileDesc = IrpSp->FileObject->FsContext2;
 | 
					        FSP_FILE_DESC *FileDesc = IrpSp->FileObject->FsContext2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ASSERT(FileNode == FileDesc->FileNode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        FspFileNodeInvalidateFileInfo(FileNode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        FileDesc->DidSetReparsePoint = TRUE;
 | 
					        FileDesc->DidSetReparsePoint = TRUE;
 | 
				
			||||||
        FileDesc->DidSetMetadata = TRUE;
 | 
					        FileDesc->DidSetMetadata = TRUE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user