From cf25432eedcd6c071912c54e55f219104faf83f1 Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Sat, 29 Sep 2018 16:21:44 +0200 Subject: [PATCH] [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 e7633a331f9..c10729080d0 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 -- 2.17.1