sys: FspFileNodeRename: handle cleaned up but not closed file

This commit is contained in:
Bill Zissimopoulos 2016-11-22 17:27:52 -08:00
parent 1f385a9ab5
commit ee469b40e7
2 changed files with 30 additions and 2 deletions

View File

@ -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);

View File

@ -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);