Fixed ticket #601: Bug in IoCompletionPort ioqueue with TCP server socket causes ioqueue to unable to accept incoming TCP connections

git-svn-id: https://svn.pjsip.org/repos/pjproject/trunk@2240 74dad513-b988-da41-8d7b-12977e46ad98
diff --git a/pjlib/src/pj/ioqueue_winnt.c b/pjlib/src/pj/ioqueue_winnt.c
index a5618e3..29bb368 100644
--- a/pjlib/src/pj/ioqueue_winnt.c
+++ b/pjlib/src/pj/ioqueue_winnt.c
@@ -175,22 +175,31 @@
     PJ_CHECK_STACK();
 
     /* Operation complete immediately. */
-    GetAcceptExSockaddrs( accept_overlapped->accept_buf,
-			  0, 
-			  ACCEPT_ADDR_LEN,
-			  ACCEPT_ADDR_LEN,
-			  &local,
-			  &locallen,
-			  &remote,
-			  &remotelen);
-    if (*accept_overlapped->addrlen >= locallen) {
-        pj_memcpy(accept_overlapped->local, local, locallen);
-        pj_memcpy(accept_overlapped->remote, remote, locallen);
-    } else {
-        pj_bzero(accept_overlapped->local, *accept_overlapped->addrlen);
-        pj_bzero(accept_overlapped->remote, *accept_overlapped->addrlen);
+    if (accept_overlapped->addrlen) {
+	GetAcceptExSockaddrs( accept_overlapped->accept_buf,
+			      0, 
+			      ACCEPT_ADDR_LEN,
+			      ACCEPT_ADDR_LEN,
+			      &local,
+			      &locallen,
+			      &remote,
+			      &remotelen);
+	if (*accept_overlapped->addrlen >= locallen) {
+	    if (accept_overlapped->local)
+		pj_memcpy(accept_overlapped->local, local, locallen);
+	    if (accept_overlapped->remote)
+		pj_memcpy(accept_overlapped->remote, remote, locallen);
+	} else {
+	    if (accept_overlapped->local)
+		pj_bzero(accept_overlapped->local, 
+			 *accept_overlapped->addrlen);
+	    if (accept_overlapped->remote)
+		pj_bzero(accept_overlapped->remote, 
+			 *accept_overlapped->addrlen);
+	}
+
+	*accept_overlapped->addrlen = locallen;
     }
-    *accept_overlapped->addrlen = locallen;
     if (accept_overlapped->newsock_ptr)
         *accept_overlapped->newsock_ptr = accept_overlapped->newsock;
     accept_overlapped->operation = 0;
@@ -700,18 +709,20 @@
             if (key->cb.on_accept_complete) {
                 ioqueue_accept_rec *accept_rec = (ioqueue_accept_rec*)pOv;
 		pj_status_t status = PJ_SUCCESS;
+		pj_sock_t newsock;
 
-		if (accept_rec->newsock == PJ_INVALID_SOCKET) {
+		newsock = accept_rec->newsock;
+		accept_rec->newsock = PJ_INVALID_SOCKET;
+
+		if (newsock == PJ_INVALID_SOCKET) {
 		    int dwError = WSAGetLastError();
 		    if (dwError == 0) dwError = OSERR_ENOTCONN;
 		    status = PJ_RETURN_OS_ERROR(dwError);
 		}
 
-	        key->cb.on_accept_complete(key, 
-                                           (pj_ioqueue_op_key_t*)pOv, 
-                                           accept_rec->newsock,
-                                           status);
-		accept_rec->newsock = PJ_INVALID_SOCKET;
+	        key->cb.on_accept_complete(key, (pj_ioqueue_op_key_t*)pOv,
+                                           newsock, status);
+		
             }
 	    break;
 	case PJ_IOQUEUE_OP_CONNECT: