- 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); 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 VOID
CleanupPendingIrp(PAFD_FCB FCB, PIRP Irp, PIO_STACK_LOCATION IrpSp, PAFD_ACTIVE_POLL Poll) 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) IrpSp->MajorFunction == IRP_MJ_READ)
{ {
RecvReq = GetLockedData(Irp, IrpSp); 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 || else if ((IrpSp->Parameters.DeviceIoControl.IoControlCode == IOCTL_AFD_SEND ||
IrpSp->MajorFunction == IRP_MJ_WRITE) && IrpSp->MajorFunction == IRP_MJ_WRITE))
!(FCB->Flags & AFD_ENDPOINT_CONNECTIONLESS))
{ {
SendReq = GetLockedData(Irp, IrpSp); 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) 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)); (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 ) { static VOID RefillSocketBuffer( PAFD_FCB FCB ) {
if( !FCB->ReceiveIrp.InFlightRequest && if( !FCB->ReceiveIrp.InFlightRequest &&
!(FCB->PollState & (AFD_EVENT_CLOSE | AFD_EVENT_ABORT)) ) { !(FCB->PollState & (AFD_EVENT_CLOSE | AFD_EVENT_ABORT)) ) {
@ -343,10 +301,11 @@ SatisfyPacketRecvRequest( PAFD_FCB FCB, PIRP Irp,
GetLockedData(Irp, IrpSp); GetLockedData(Irp, IrpSp);
UINT BytesToCopy = 0, BytesAvailable = DatagramRecv->Len, AddrLen = 0; UINT BytesToCopy = 0, BytesAvailable = DatagramRecv->Len, AddrLen = 0;
PAFD_MAPBUF Map; PAFD_MAPBUF Map;
BOOLEAN ExtraBuffers = CheckUnlockExtraBuffers(FCB, IrpSp);
Map = (PAFD_MAPBUF)(RecvReq->BufferArray + Map = (PAFD_MAPBUF)(RecvReq->BufferArray +
RecvReq->BufferCount + RecvReq->BufferCount +
EXTRA_LOCK_BUFFERS); (ExtraBuffers ? EXTRA_LOCK_BUFFERS : 0));
BytesToCopy = BytesToCopy =
MIN( RecvReq->BufferArray[0].len, BytesAvailable ); MIN( RecvReq->BufferArray[0].len, BytesAvailable );
@ -356,7 +315,7 @@ SatisfyPacketRecvRequest( PAFD_FCB FCB, PIRP Irp,
if( Map[0].Mdl ) { if( Map[0].Mdl ) {
/* Copy the address */ /* 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")); AFD_DbgPrint(MID_TRACE,("Checking TAAddressCount\n"));
if( DatagramRecv->Address->TAAddressCount != 1 ) { if( DatagramRecv->Address->TAAddressCount != 1 ) {
@ -491,7 +450,7 @@ AfdConnectedSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
&DatagramRecv->ListEntry); &DatagramRecv->ListEntry);
} }
if (IsListEmpty(&FCB->DatagramList)) if (!IsListEmpty(&FCB->DatagramList))
{ {
FCB->PollState |= AFD_EVENT_RECEIVE; FCB->PollState |= AFD_EVENT_RECEIVE;
FCB->PollStatus[FD_READ_BIT] = STATUS_SUCCESS; FCB->PollStatus[FD_READ_BIT] = STATUS_SUCCESS;
@ -748,7 +707,7 @@ AfdPacketSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
&DatagramRecv->ListEntry); &DatagramRecv->ListEntry);
} }
if (IsListEmpty(&FCB->DatagramList)) if (!IsListEmpty(&FCB->DatagramList))
{ {
FCB->PollState |= AFD_EVENT_RECEIVE; FCB->PollState |= AFD_EVENT_RECEIVE;
FCB->PollStatus[FD_READ_BIT] = STATUS_SUCCESS; FCB->PollStatus[FD_READ_BIT] = STATUS_SUCCESS;
@ -757,7 +716,7 @@ AfdPacketSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
else else
FCB->PollState &= ~AFD_EVENT_RECEIVE; 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); return UnlockAndMaybeComplete(FCB, Status, Irp, Irp->IoStatus.Information);
} }
@ -766,7 +725,7 @@ AfdPacketSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
AFD_DbgPrint(MID_TRACE,("Nonblocking\n")); AFD_DbgPrint(MID_TRACE,("Nonblocking\n"));
Status = STATUS_CANT_WAIT; Status = STATUS_CANT_WAIT;
FCB->PollState &= ~AFD_EVENT_RECEIVE; FCB->PollState &= ~AFD_EVENT_RECEIVE;
UnlockBuffers( RecvReq->BufferArray, RecvReq->BufferCount, FALSE ); UnlockBuffers( RecvReq->BufferArray, RecvReq->BufferCount, TRUE );
return UnlockAndMaybeComplete( FCB, Status, Irp, 0 ); return UnlockAndMaybeComplete( FCB, Status, Irp, 0 );
} }
else else

View file

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