https://git.reactos.org/?p=reactos.git;a=commitdiff;h=cf25432eedcd6c071912c5...
commit cf25432eedcd6c071912c54e55f219104faf83f1 Author: Pierre Schweitzer pierre@reactos.org AuthorDate: Sat Sep 29 16:21:44 2018 +0200 Commit: Pierre Schweitzer pierre@reactos.org CommitDate: Sat Sep 29 16:25:58 2018 +0200
[NTOSKRNL] Don't lock file object on close if we're not called by Ob
IopCloseFile can be called by IopDeleteFile. In that situation, it doesn't set any process as first parameter. Furthermore, we are in a situation where it's not required to lock the file object (see the assert before the call). --- ntoskrnl/io/iomgr/file.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/ntoskrnl/io/iomgr/file.c b/ntoskrnl/io/iomgr/file.c index e7633a331f..c10729080d 100644 --- a/ntoskrnl/io/iomgr/file.c +++ b/ntoskrnl/io/iomgr/file.c @@ -2033,7 +2033,11 @@ IopCloseFile(IN PEPROCESS Process OPTIONAL, FileObject->Flags |= FO_HANDLE_CREATED;
/* Check if this is a sync FO and lock it */ - if (FileObject->Flags & FO_SYNCHRONOUS_IO) IopLockFileObject(FileObject); + if (Process != NULL && + BooleanFlagOn(FileObject->Flags, FO_SYNCHRONOUS_IO)) + { + IopLockFileObject(FileObject); + }
/* Clear and set up Events */ KeClearEvent(&FileObject->Event); @@ -2078,7 +2082,11 @@ IopCloseFile(IN PEPROCESS Process OPTIONAL, IoFreeIrp(Irp);
/* Release the lock if we were holding it */ - if (FileObject->Flags & FO_SYNCHRONOUS_IO) IopUnlockFileObject(FileObject); + if (Process != NULL && + BooleanFlagOn(FileObject->Flags, FO_SYNCHRONOUS_IO)) + { + IopUnlockFileObject(FileObject); + } }
NTSTATUS