summaryrefslogtreecommitdiff
path: root/pjlib/src/pj/ioqueue_winnt.c
diff options
context:
space:
mode:
Diffstat (limited to 'pjlib/src/pj/ioqueue_winnt.c')
-rw-r--r--pjlib/src/pj/ioqueue_winnt.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/pjlib/src/pj/ioqueue_winnt.c b/pjlib/src/pj/ioqueue_winnt.c
index fbf308e1..71977cbd 100644
--- a/pjlib/src/pj/ioqueue_winnt.c
+++ b/pjlib/src/pj/ioqueue_winnt.c
@@ -26,6 +26,7 @@
#include <pj/log.h>
#include <pj/assert.h>
#include <pj/errno.h>
+#include <pj/compat/socket.h>
#if defined(PJ_HAS_WINSOCK2_H) && PJ_HAS_WINSOCK2_H != 0
@@ -173,7 +174,7 @@ static void ioqueue_on_accept_complete(ioqueue_accept_rec *accept_overlapped)
&locallen,
&remote,
&remotelen);
- if (*accept_overlapped->addrlen > locallen) {
+ if (*accept_overlapped->addrlen >= locallen) {
pj_memcpy(accept_overlapped->local, local, locallen);
pj_memcpy(accept_overlapped->remote, remote, locallen);
} else {
@@ -627,10 +628,18 @@ static pj_bool_t poll_iocp( HANDLE hIocp, DWORD dwTimeout,
ioqueue_on_accept_complete((ioqueue_accept_rec*)pOv);
if (key->cb.on_accept_complete) {
ioqueue_accept_rec *accept_rec = (ioqueue_accept_rec*)pOv;
+ pj_status_t status = PJ_SUCCESS;
+
+ if (accept_rec->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,
- PJ_SUCCESS);
+ status);
accept_rec->newsock = PJ_INVALID_SOCKET;
}
break;