mirror of
				https://github.com/winfsp/winfsp.git
				synced 2025-11-03 20:48:08 -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);
 | 
			
		||||
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)
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
@@ -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();
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user