- Fix typos from my previous commit
- Fix another bug with recv() on a datagram socket
- Fix cancellation bugs

svn path=/trunk/; revision=52725
This commit is contained in:
Cameron Gutman 2011-07-18 11:27:01 +00:00
parent 2f00016a72
commit 78bd31b30d
3 changed files with 59 additions and 52 deletions

View file

@ -945,6 +945,54 @@ AfdDispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp)
return (Status);
}
BOOLEAN CheckUnlockExtraBuffers(PAFD_FCB FCB, PIO_STACK_LOCATION IrpSp)
{
if (FCB->Flags & AFD_ENDPOINT_CONNECTIONLESS)
{
if (IrpSp->MajorFunction == IRP_MJ_READ || IrpSp->MajorFunction == IRP_MJ_WRITE)
{
/* read()/write() call - no extra buffers */
return FALSE;
}
else if (IrpSp->MajorFunction == IRP_MJ_DEVICE_CONTROL)
{
if (IrpSp->Parameters.DeviceIoControl.IoControlCode == IOCTL_AFD_RECV_DATAGRAM)
{
/* recvfrom() call - extra buffers */
return TRUE;
}
else if (IrpSp->Parameters.DeviceIoControl.IoControlCode == IOCTL_AFD_RECV)
{
/* recv() call - no extra buffers */
return FALSE;
}
else if (IrpSp->Parameters.DeviceIoControl.IoControlCode == IOCTL_AFD_SEND ||
IrpSp->Parameters.DeviceIoControl.IoControlCode == IOCTL_AFD_SEND_DATAGRAM)
{
/* send()/sendto() call - no extra buffers */
return FALSE;
}
else
{
/* Unknown IOCTL */
ASSERT(FALSE);
return FALSE;
}
}
else
{
/* Unknown IRP_MJ code */
ASSERT(FALSE);
return FALSE;
}
}
else
{
/* Connection-oriented never has extra buffers */
return FALSE;
}
}
VOID
CleanupPendingIrp(PAFD_FCB FCB, PIRP Irp, PIO_STACK_LOCATION IrpSp, PAFD_ACTIVE_POLL Poll)
{
@ -956,14 +1004,13 @@ CleanupPendingIrp(PAFD_FCB FCB, PIRP Irp, PIO_STACK_LOCATION IrpSp, PAFD_ACTIVE_
IrpSp->MajorFunction == IRP_MJ_READ)
{
RecvReq = GetLockedData(Irp, IrpSp);
UnlockBuffers(RecvReq->BufferArray, RecvReq->BufferCount, FALSE);
UnlockBuffers(RecvReq->BufferArray, RecvReq->BufferCount, CheckUnlockExtraBuffers(FCB, IrpSp));
}
else if ((IrpSp->Parameters.DeviceIoControl.IoControlCode == IOCTL_AFD_SEND ||
IrpSp->MajorFunction == IRP_MJ_WRITE) &&
!(FCB->Flags & AFD_ENDPOINT_CONNECTIONLESS))
IrpSp->MajorFunction == IRP_MJ_WRITE))
{
SendReq = GetLockedData(Irp, IrpSp);
UnlockBuffers(SendReq->BufferArray, SendReq->BufferCount, FALSE);
UnlockBuffers(SendReq->BufferArray, SendReq->BufferCount, CheckUnlockExtraBuffers(FCB, IrpSp));
}
else if (IrpSp->Parameters.DeviceIoControl.IoControlCode == IOCTL_AFD_SELECT)
{

View file

@ -46,48 +46,6 @@ static BOOLEAN CantReadMore( PAFD_FCB FCB ) {
(FCB->PollState & (AFD_EVENT_CLOSE | AFD_EVENT_ABORT));
}
static BOOLEAN CheckUnlockExtraBuffers(PAFD_FCB FCB, PIO_STACK_LOCATION IrpSp)
{
if (FCB->Flags & AFD_ENDPOINT_CONNECTIONLESS)
{
if (IrpSp->MajorFunction == IRP_MJ_READ)
{
/* read() call - no extra buffers */
return FALSE;
}
else if (IrpSp->MajorFunction == IRP_MJ_DEVICE_CONTROL)
{
if (IrpSp->Parameters.DeviceIoControl.IoControlCode == IOCTL_AFD_RECV_DATAGRAM)
{
/* recvfrom() call - extra buffers */
return TRUE;
}
else if (IrpSp->Parameters.DeviceIoControl.IoControlCode == IOCTL_AFD_RECV)
{
/* recv() call - no extra buffers */
return FALSE;
}
else
{
/* Unknown IOCTL */
ASSERT(FALSE);
return FALSE;
}
}
else
{
/* Unknown IRP_MJ code */
ASSERT(FALSE);
return FALSE;
}
}
else
{
/* Connection-oriented never has extra buffers */
return FALSE;
}
}
static VOID RefillSocketBuffer( PAFD_FCB FCB ) {
if( !FCB->ReceiveIrp.InFlightRequest &&
!(FCB->PollState & (AFD_EVENT_CLOSE | AFD_EVENT_ABORT)) ) {
@ -343,10 +301,11 @@ SatisfyPacketRecvRequest( PAFD_FCB FCB, PIRP Irp,
GetLockedData(Irp, IrpSp);
UINT BytesToCopy = 0, BytesAvailable = DatagramRecv->Len, AddrLen = 0;
PAFD_MAPBUF Map;
BOOLEAN ExtraBuffers = CheckUnlockExtraBuffers(FCB, IrpSp);
Map = (PAFD_MAPBUF)(RecvReq->BufferArray +
RecvReq->BufferCount +
EXTRA_LOCK_BUFFERS);
(ExtraBuffers ? EXTRA_LOCK_BUFFERS : 0));
BytesToCopy =
MIN( RecvReq->BufferArray[0].len, BytesAvailable );
@ -356,7 +315,7 @@ SatisfyPacketRecvRequest( PAFD_FCB FCB, PIRP Irp,
if( Map[0].Mdl ) {
/* Copy the address */
if( Map[1].Mdl && Map[2].Mdl ) {
if( ExtraBuffers && Map[1].Mdl && Map[2].Mdl ) {
AFD_DbgPrint(MID_TRACE,("Checking TAAddressCount\n"));
if( DatagramRecv->Address->TAAddressCount != 1 ) {
@ -491,7 +450,7 @@ AfdConnectedSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
&DatagramRecv->ListEntry);
}
if (IsListEmpty(&FCB->DatagramList))
if (!IsListEmpty(&FCB->DatagramList))
{
FCB->PollState |= AFD_EVENT_RECEIVE;
FCB->PollStatus[FD_READ_BIT] = STATUS_SUCCESS;
@ -748,7 +707,7 @@ AfdPacketSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
&DatagramRecv->ListEntry);
}
if (IsListEmpty(&FCB->DatagramList))
if (!IsListEmpty(&FCB->DatagramList))
{
FCB->PollState |= AFD_EVENT_RECEIVE;
FCB->PollStatus[FD_READ_BIT] = STATUS_SUCCESS;
@ -757,7 +716,7 @@ AfdPacketSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
else
FCB->PollState &= ~AFD_EVENT_RECEIVE;
UnlockBuffers(RecvReq->BufferArray, RecvReq->BufferCount, FALSE);
UnlockBuffers(RecvReq->BufferArray, RecvReq->BufferCount, TRUE);
return UnlockAndMaybeComplete(FCB, Status, Irp, Irp->IoStatus.Information);
}
@ -766,7 +725,7 @@ AfdPacketSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
AFD_DbgPrint(MID_TRACE,("Nonblocking\n"));
Status = STATUS_CANT_WAIT;
FCB->PollState &= ~AFD_EVENT_RECEIVE;
UnlockBuffers( RecvReq->BufferArray, RecvReq->BufferCount, FALSE );
UnlockBuffers( RecvReq->BufferArray, RecvReq->BufferCount, TRUE );
return UnlockAndMaybeComplete( FCB, Status, Irp, 0 );
}
else

View file

@ -316,6 +316,7 @@ VOID DestroySocket( PAFD_FCB FCB );
VOID NTAPI AfdCancelHandler(PDEVICE_OBJECT DeviceObject,
PIRP Irp);
VOID RetryDisconnectCompletion(PAFD_FCB FCB);
BOOLEAN CheckUnlockExtraBuffers(PAFD_FCB FCB, PIO_STACK_LOCATION IrpSp);
/* read.c */