diff options
author | Benny Prijono <bennylp@teluu.com> | 2008-08-26 14:41:26 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2008-08-26 14:41:26 +0000 |
commit | 472c21109bff70d66f59bd113b4031fde29a8a86 (patch) | |
tree | 6f7dc1a28c99ad53ad2749de551da2c15734fcee /pjlib/src/pj/ioqueue_winnt.c | |
parent | fc373f54147e79c6b9938b7e1aff2713da5628b9 (diff) |
Fixed ticket #601: Bug in IoCompletionPort ioqueue with TCP server socket causes ioqueue to unable to accept incoming TCP connections
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@2240 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjlib/src/pj/ioqueue_winnt.c')
-rw-r--r-- | pjlib/src/pj/ioqueue_winnt.c | 53 |
1 files changed, 32 insertions, 21 deletions
diff --git a/pjlib/src/pj/ioqueue_winnt.c b/pjlib/src/pj/ioqueue_winnt.c index a5618e36..29bb3684 100644 --- a/pjlib/src/pj/ioqueue_winnt.c +++ b/pjlib/src/pj/ioqueue_winnt.c @@ -175,22 +175,31 @@ static void ioqueue_on_accept_complete(ioqueue_accept_rec *accept_overlapped) 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 @@ static pj_bool_t poll_iocp( HANDLE hIocp, DWORD dwTimeout, 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: |