tcp: print error when we can't allocate a bucket.

event: Don't report eof if we have bytes to deliver still.
       Made a mistake moving statuses around.  Requeue the request on
       STATUS_PENDING.

svn path=/trunk/; revision=11016
This commit is contained in:
Art Yerkes 2004-09-23 20:51:46 +00:00
parent e91d1416ab
commit b0f758cf33
2 changed files with 14 additions and 4 deletions

View file

@ -23,7 +23,8 @@ int TCPSocketState(void *ClientData,
PTDI_BUCKET Bucket;
PLIST_ENTRY Entry;
TI_DbgPrint(MID_TRACE,("Called: NewState %x\n", NewState));
TI_DbgPrint(MID_TRACE,("Called: NewState %x (Conn %x)\n",
NewState, Connection));
if( !Connection ) {
TI_DbgPrint(MID_TRACE,("Socket closing.\n"));
@ -44,6 +45,10 @@ int TCPSocketState(void *ClientData,
ExFreePool( Bucket );
}
} else if( (NewState & SEL_READ) || (NewState & SEL_FIN) ) {
TI_DbgPrint(MID_TRACE,("Readable (or closed): irp list %s\n",
IsListEmpty(&Connection->ReceiveRequest) ?
"empty" : "nonempty"));
while( !IsListEmpty( &Connection->ReceiveRequest ) ) {
PIRP Irp;
OSK_UINT RecvLen = 0, Received = 0;
@ -70,7 +75,7 @@ int TCPSocketState(void *ClientData,
TI_DbgPrint(MID_TRACE,
("Reading %d bytes to %x\n", RecvLen, RecvBuffer));
if( NewState & SEL_FIN ) {
if( NewState & SEL_FIN && !RecvLen ) {
Status = STATUS_END_OF_FILE;
Received = 0;
} else
@ -93,7 +98,7 @@ int TCPSocketState(void *ClientData,
Complete( Bucket->Request.RequestContext,
STATUS_SUCCESS, Received );
} else if( Status == STATUS_SUCCESS ) {
} else if( Status == STATUS_PENDING ) {
InsertHeadList( &Connection->ReceiveRequest,
&Bucket->Entry );
break;

View file

@ -310,11 +310,16 @@ NTSTATUS TCPReceiveData
(Status == STATUS_SUCCESS && Received == 0) ) {
/* Freed in TCPSocketState */
Bucket = ExAllocatePool( NonPagedPool, sizeof(*Bucket) );
if( !Bucket ) return STATUS_NO_MEMORY;
if( !Bucket ) {
TI_DbgPrint(MID_TRACE,("Failed to allocate bucket\n"));
return STATUS_NO_MEMORY;
}
Bucket->Request = *Request;
*BytesReceived = 0;
InsertHeadList( &Connection->ReceiveRequest, &Bucket->Entry );
Status = STATUS_PENDING;
TI_DbgPrint(MID_TRACE,("Queued read irp\n"));
} else {
TI_DbgPrint(MID_TRACE,("Got status %x, bytes %d\n", Status, Received));
*BytesReceived = Received;