From 4f54a6819072f518da9143bf2693d8570375d852 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 24 Aug 2008 01:34:17 +0000 Subject: [PATCH] - Skip ObReferenceObjectByHandle if HandleArray[i].Handle is NULL - Fail if ObReferenceObjectByHandle didn't succeed - Remove a bad ASSERT I added in my last commit svn path=/branches/aicom-network-fixes/; revision=35583 --- drivers/network/afd/afd/lock.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/drivers/network/afd/afd/lock.c b/drivers/network/afd/afd/lock.c index 3eeba0e0e6c..d75156cc4dc 100644 --- a/drivers/network/afd/afd/lock.c +++ b/drivers/network/afd/afd/lock.c @@ -168,7 +168,7 @@ VOID UnlockBuffers( PAFD_WSABUF Buf, UINT Count, BOOL Address ) { * pointers. This will allow the system to do proper alerting */ PAFD_HANDLE LockHandles( PAFD_HANDLE HandleArray, UINT HandleCount ) { UINT i; - NTSTATUS Status; + NTSTATUS Status = STATUS_SUCCESS; PAFD_HANDLE FileObjects = ExAllocatePool ( NonPagedPool, HandleCount * sizeof(AFD_HANDLE) ); @@ -177,13 +177,21 @@ PAFD_HANDLE LockHandles( PAFD_HANDLE HandleArray, UINT HandleCount ) { HandleArray[i].Status = 0; HandleArray[i].Events = HandleArray[i].Events; FileObjects[i].Handle = 0; - Status = ObReferenceObjectByHandle - ( (PVOID)HandleArray[i].Handle, - FILE_ALL_ACCESS, - NULL, - KernelMode, - (PVOID*)&FileObjects[i].Handle, - NULL ); + if( !HandleArray[i].Handle ) continue; + if( NT_SUCCESS(Status) ) { + Status = ObReferenceObjectByHandle + ( (PVOID)HandleArray[i].Handle, + FILE_ALL_ACCESS, + NULL, + KernelMode, + (PVOID*)&FileObjects[i].Handle, + NULL ); + } + } + + if( !NT_SUCCESS(Status) ) { + UnlockHandles( FileObjects, HandleCount ); + return NULL; } return FileObjects; @@ -324,7 +332,6 @@ VOID SocketCalloutEnter( PAFD_FCB FCB ) { VOID SocketCalloutLeave( PAFD_FCB FCB ) { ASSERT(FCB->Critical); - ASSERT(!FCB->Locked); FCB->Critical = FALSE; SocketAcquireStateLock( FCB ); }