--- tcpip.c.orig	Wed Apr  9 11:52:04 2003
+++ tcpip.c	Thu Apr 10 01:13:57 2003
@@ -540,7 +540,16 @@
             SocketStatus |= SOCK_CONNECTED;
             break;
           }
-          case FIN_WAIT_1 : { TCPStateMachine = FIN_WAIT_2; break; } // ACK of our FIN?
+          case FIN_WAIT_1 :                      // ACK of our FIN?
+          {
+            TCPStateMachine = FIN_WAIT_2;
+            // Note from FreeBSD sources (/usr/src/sys/netinet/tcp_input.c):
+            // "If we can't receive any more data, then closing user can proceed.
+			//  Starting the timer is contrary to the specification, but if 
+            //  we don't get a FIN we'll hang forever."
+            TCPStartTimeWaitTimer();
+            break;
+          }
           case CLOSING :    { TCPStateMachine = TIME_WAIT; break; }  // ACK of our FIN?
           case LAST_ACK :                                            // ACK of our FIN?
           {
@@ -571,6 +580,8 @@
             SocketStatus |= SOCK_DATA_AVAILABLE;           // indicate the new data to user
             TCPAckNr += NrOfDataBytes;
             PrepareTCP_FRAME(TCP_CODE_ACK);                // ACK rec'd data
+            if (TCPStateMachine == FIN_WAIT_2)             // we can receive data while waiting for FIN
+              TCPRestartTimer(); 
           }
               
       if (TCPCode & TCP_CODE_FIN)                // FIN??
