mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-23 00:43:00 -05:00
sys: FspFileNodeRename: handle cleaned up but not closed file
This commit is contained in:
parent
1f385a9ab5
commit
ee469b40e7
@ -1230,6 +1230,7 @@ VOID FspFileNodeRename(FSP_FILE_NODE *FileNode, PUNICODE_STRING NewFileName)
|
|||||||
|
|
||||||
PDEVICE_OBJECT FsvolDeviceObject = FileNode->FsvolDeviceObject;
|
PDEVICE_OBJECT FsvolDeviceObject = FileNode->FsvolDeviceObject;
|
||||||
BOOLEAN Deleted, Inserted, AcquireForeign;
|
BOOLEAN Deleted, Inserted, AcquireForeign;
|
||||||
|
FSP_FILE_NODE *InsertedFileNode;
|
||||||
USHORT FileNameLength;
|
USHORT FileNameLength;
|
||||||
PWSTR ExternalFileName;
|
PWSTR ExternalFileName;
|
||||||
|
|
||||||
@ -1274,9 +1275,33 @@ VOID FspFileNodeRename(FSP_FILE_NODE *FileNode, PUNICODE_STRING NewFileName)
|
|||||||
if (0 != ExternalFileName)
|
if (0 != ExternalFileName)
|
||||||
FspFree(ExternalFileName);
|
FspFree(ExternalFileName);
|
||||||
|
|
||||||
FspFsvolDeviceInsertContextByName(FsvolDeviceObject, &DescendantFileNode->FileName, DescendantFileNode,
|
InsertedFileNode = FspFsvolDeviceInsertContextByName(
|
||||||
|
FsvolDeviceObject, &DescendantFileNode->FileName, DescendantFileNode,
|
||||||
&DescendantFileNode->ContextByNameElementStorage, &Inserted);
|
&DescendantFileNode->ContextByNameElementStorage, &Inserted);
|
||||||
ASSERT(Inserted);
|
if (!Inserted)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Handle files that have been Cleanup'ed but not Close'd.
|
||||||
|
* For example, this can happen when the user has mapped and closed a file
|
||||||
|
* or immediately after breaking a Batch oplock.
|
||||||
|
*/
|
||||||
|
|
||||||
|
ASSERT(FspFileNodeIsValid(InsertedFileNode));
|
||||||
|
ASSERT(DescendantFileNode != InsertedFileNode);
|
||||||
|
ASSERT(0 == InsertedFileNode->HandleCount);
|
||||||
|
ASSERT(0 != InsertedFileNode->OpenCount);
|
||||||
|
|
||||||
|
InsertedFileNode->OpenCount = 0;
|
||||||
|
FspFsvolDeviceDeleteContextByName(FsvolDeviceObject, &InsertedFileNode->FileName, &Deleted);
|
||||||
|
ASSERT(Deleted);
|
||||||
|
|
||||||
|
FspFileNodeDereference(InsertedFileNode);
|
||||||
|
|
||||||
|
FspFsvolDeviceInsertContextByName(
|
||||||
|
FsvolDeviceObject, &DescendantFileNode->FileName, DescendantFileNode,
|
||||||
|
&DescendantFileNode->ContextByNameElementStorage, &Inserted);
|
||||||
|
ASSERT(Inserted);
|
||||||
|
}
|
||||||
|
|
||||||
if (AcquireForeign)
|
if (AcquireForeign)
|
||||||
FspFileNodeReleaseForeign(DescendantFileNode);
|
FspFileNodeReleaseForeign(DescendantFileNode);
|
||||||
|
@ -300,6 +300,9 @@ BOOL WINAPI HookMoveFileExW(
|
|||||||
PrepareFileName(lpExistingFileName, OldFileNameBuf);
|
PrepareFileName(lpExistingFileName, OldFileNameBuf);
|
||||||
PrepareFileName(lpNewFileName, NewFileNameBuf);
|
PrepareFileName(lpNewFileName, NewFileNameBuf);
|
||||||
|
|
||||||
|
MaybeRequestOplock(lpExistingFileName);
|
||||||
|
MaybeRequestOplock(lpNewFileName);
|
||||||
|
|
||||||
MaybeAdjustTraversePrivilege(FALSE);
|
MaybeAdjustTraversePrivilege(FALSE);
|
||||||
Success = MoveFileExW(OldFileNameBuf, NewFileNameBuf, dwFlags);
|
Success = MoveFileExW(OldFileNameBuf, NewFileNameBuf, dwFlags);
|
||||||
MaybeAdjustTraversePrivilege(TRUE);
|
MaybeAdjustTraversePrivilege(TRUE);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user