From cff9e3c02f438bd3a7b2109f705b0d7dbc00ca97 Mon Sep 17 00:00:00 2001 From: Gunnar Dalsnes Date: Mon, 17 Mar 2003 22:30:55 +0000 Subject: [PATCH] don't touch FileObject after IoCallDriver + cleanup svn path=/trunk/; revision=4326 --- reactos/ntoskrnl/io/lock.c | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/reactos/ntoskrnl/io/lock.c b/reactos/ntoskrnl/io/lock.c index 38cdd61b53c..3b1469316d7 100644 --- a/reactos/ntoskrnl/io/lock.c +++ b/reactos/ntoskrnl/io/lock.c @@ -58,6 +58,7 @@ NtLockFile ( IO_STATUS_BLOCK LocalIoStatusBlock; PIO_STATUS_BLOCK IoStatusBlock; PDEVICE_OBJECT DeviceObject; + ULONG FobFlags; //FIXME: instead of this, use SEH when available? if (!Length || !ByteOffset) { @@ -65,13 +66,9 @@ NtLockFile ( goto fail; } - /* - BUGBUG: ObReferenceObjectByHandle fails if DesiredAccess=0 and mode=UserMode! - It should ONLY fail if we desire an access that conflict with granted access! - */ Status = ObReferenceObjectByHandle( FileHandle, - FILE_READ_DATA,//BUGBUG: have to use something...but shouldn't have to! + 0, IoFileObjectType, ExGetPreviousMode(), (PVOID*)&FileObject, @@ -127,7 +124,6 @@ NtLockFile ( StackPtr = IoGetNextIrpStackLocation(Irp); StackPtr->MajorFunction = IRP_MJ_LOCK_CONTROL; StackPtr->MinorFunction = IRP_MN_LOCK; - StackPtr->DeviceObject = DeviceObject; StackPtr->FileObject = FileObject; if (ExclusiveLock) StackPtr->Flags |= SL_EXCLUSIVE_LOCK; @@ -157,15 +153,17 @@ NtLockFile ( TRUE, TRUE ); + //can't touch FileObject after IoCallDriver since it might be freed + FobFlags = FileObject->Flags; Status = IofCallDriver(DeviceObject, Irp); - if (Status == STATUS_PENDING && (FileObject->Flags & FO_SYNCHRONOUS_IO)) { + if (Status == STATUS_PENDING && (FobFlags & FO_SYNCHRONOUS_IO)) { Status = KeWaitForSingleObject( Event, Executive, ExGetPreviousMode() , - (FileObject->Flags & FO_ALERTABLE_IO) ? TRUE : FALSE, + (FobFlags & FO_ALERTABLE_IO) ? TRUE : FALSE, NULL ); @@ -181,7 +179,7 @@ NtLockFile ( Status = LocalIoStatusBlock.Status; } - if (FileObject->Flags & FO_SYNCHRONOUS_IO) + if (FobFlags & FO_SYNCHRONOUS_IO) *UserIoStatusBlock = LocalIoStatusBlock; return Status;