- Fix a race condition

svn path=/trunk/; revision=61113
This commit is contained in:
Thomas Faber 2013-11-28 14:32:04 +00:00
parent 1aa6d29ccb
commit 48f677b66a

View file

@ -827,12 +827,10 @@ SerialDeviceControl(
Status = STATUS_INVALID_PARAMETER;
else
{
/* FIXME: Race condition here:
* If an interrupt comes before we can mark the Irp
* as pending, it might be possible to complete the
* Irp before pending it, leading to a crash! */
IoMarkIrpPending(Irp);
WaitingIrp = InterlockedCompareExchangePointer(
(PVOID)&DeviceExtension->WaitOnMaskIrp,
&DeviceExtension->WaitOnMaskIrp,
Irp,
NULL);
@ -841,13 +839,11 @@ SerialDeviceControl(
{
/* Unable to have a 2nd pending IRP for this IOCTL */
WARN_(SERIAL, "Unable to pend a second IRP for IOCTL_SERIAL_WAIT_ON_MASK\n");
Status = STATUS_INVALID_PARAMETER;
}
else
{
Status = STATUS_PENDING;
/* FIXME: immediately return if a wait event already occurred */
Irp->IoStatus.Information = 0;
Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
}
return STATUS_PENDING;
}
break;
}