- Replace MmMapLockedPages with MmGetSystemAddressForMdlSafe
authorCameron Gutman <aicommander@gmail.com>
Thu, 21 Aug 2008 14:46:03 +0000 (14:46 +0000)
committerCameron Gutman <aicommander@gmail.com>
Thu, 21 Aug 2008 14:46:03 +0000 (14:46 +0000)
 - Add a check to UnlockRequest
 - Enclose MmProbeAndLockPages in SEH
 - Fixes bug 3672

svn path=/branches/aicom-network-fixes/; revision=35507

drivers/network/afd/afd/lock.c

index ed7227e..764c6e6 100644 (file)
@@ -37,7 +37,7 @@ PVOID LockRequest( PIRP Irp, PIO_STACK_LOCATION IrpSp ) {
        }
 
        IrpSp->Parameters.DeviceIoControl.Type3InputBuffer =
-           MmMapLockedPages( Irp->MdlAddress, KernelMode );
+           MmGetSystemAddressForMdlSafe( Irp->MdlAddress, NormalPagePriority );
 
        if( !IrpSp->Parameters.DeviceIoControl.Type3InputBuffer ) {
            IoFreeMdl( Irp->MdlAddress );
@@ -50,12 +50,13 @@ PVOID LockRequest( PIRP Irp, PIO_STACK_LOCATION IrpSp ) {
 }
 
 VOID UnlockRequest( PIRP Irp, PIO_STACK_LOCATION IrpSp ) {
-    if( !IrpSp->Parameters.DeviceIoControl.Type3InputBuffer || !Irp->MdlAddress ) return;
+    PVOID Buffer = MmGetSystemAddressForMdlSafe( Irp->MdlAddress, NormalPagePriority );
+    if( IrpSp->Parameters.DeviceIoControl.Type3InputBuffer == Buffer || Buffer == NULL ) {
+       MmUnmapLockedPages( IrpSp->Parameters.DeviceIoControl.Type3InputBuffer, Irp->MdlAddress );
+        MmUnlockPages( Irp->MdlAddress );
+        IoFreeMdl( Irp->MdlAddress );
+    }
 
-    MmUnmapLockedPages( IrpSp->Parameters.DeviceIoControl.Type3InputBuffer,
-                       Irp->MdlAddress );
-    MmUnlockPages( Irp->MdlAddress );
-    IoFreeMdl( Irp->MdlAddress );
     Irp->MdlAddress = NULL;
 }
 
@@ -72,6 +73,7 @@ PAFD_WSABUF LockBuffers( PAFD_WSABUF Buf, UINT Count,
     UINT Size = sizeof(AFD_WSABUF) * (Count + Lock);
     PAFD_WSABUF NewBuf = ExAllocatePool( PagedPool, Size * 2 );
     PMDL NewMdl;
+    BOOLEAN LockFailed = FALSE;
 
     AFD_DbgPrint(MID_TRACE,("Called(%08x)\n", NewBuf));
 
@@ -117,9 +119,19 @@ PAFD_WSABUF LockBuffers( PAFD_WSABUF Buf, UINT Count,
 
            if( MapBuf[i].Mdl ) {
                AFD_DbgPrint(MID_TRACE,("Probe and lock pages\n"));
-               MmProbeAndLockPages( MapBuf[i].Mdl, KernelMode,
-                                    Write ? IoModifyAccess : IoReadAccess );
+               _SEH_TRY {
+                   MmProbeAndLockPages( MapBuf[i].Mdl, KernelMode,
+                                        Write ? IoModifyAccess : IoReadAccess );
+               } _SEH_HANDLE {
+                   LockFailed = TRUE;
+               } _SEH_END;
                AFD_DbgPrint(MID_TRACE,("MmProbeAndLock finished\n"));
+
+               if( LockFailed ) {
+                   IoFreeMdl( MapBuf[i].Mdl );
+                   MapBuf[i].Mdl = NULL;
+                   LockFailed = FALSE;
+               }
            }
        }
     }