Git conversion: Make reactos the root directory, move rosapps, rostests, wallpapers...
[reactos.git] / drivers / serial / serial / devctrl.c
index f7d1566..189f97e 100644 (file)
@@ -9,6 +9,8 @@
 
 #include "serial.h"
 
+#include <debug.h>
+
 #define IO_METHOD_FROM_CTL_CODE(ctlCode) (ctlCode&0x00000003)
 
 static VOID
@@ -827,12 +829,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,
+                                       (PVOID*)&DeviceExtension->WaitOnMaskIrp,
                                        Irp,
                                        NULL);
 
@@ -841,13 +841,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;
                }