diff options
author | wchang0222%aol.com <devnull@localhost> | 2003-11-25 00:44:57 +0000 |
---|---|---|
committer | wchang0222%aol.com <devnull@localhost> | 2003-11-25 00:44:57 +0000 |
commit | 4c632fa16d72d3f7aab2c4a3955c51a779acba17 (patch) | |
tree | 06b0aaf7c082da90bbb398aa6e28e9ce8d7a3570 | |
parent | 8e4468e745e38d583b607664921536bcfef99af3 (diff) | |
download | nspr-hg-4c632fa16d72d3f7aab2c4a3955c51a779acba17.tar.gz |
Bugzilla bug 226686: we need to close the new socket if _MD_FAST_ACCEPT or
_MD_FAST_ACCEPT_READ fails.
Tag: NSPR_4_4_BRANCH
-rw-r--r-- | pr/src/md/windows/ntio.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/pr/src/md/windows/ntio.c b/pr/src/md/windows/ntio.c index e206f787..345e253a 100644 --- a/pr/src/md/windows/ntio.c +++ b/pr/src/md/windows/ntio.c @@ -1332,6 +1332,7 @@ _PR_MD_FAST_ACCEPT(PRFileDesc *fd, PRNetAddr *raddr, PRUint32 *rlen, me->flags &= ~_PR_INTERRUPT; PR_SetError(PR_PENDING_INTERRUPT_ERROR, 0); _PR_THREAD_UNLOCK(me); + closesocket(accept_sock); return -1; } me->io_pending = PR_TRUE; @@ -1350,6 +1351,7 @@ _PR_MD_FAST_ACCEPT(PRFileDesc *fd, PRNetAddr *raddr, PRUint32 *rlen, if ( (rv == 0) && ((err = GetLastError()) != ERROR_IO_PENDING)) { /* Argh! The IO failed */ + closesocket(accept_sock); _PR_THREAD_LOCK(me); me->io_pending = PR_FALSE; me->state = _PR_RUNNING; @@ -1369,12 +1371,14 @@ _PR_MD_FAST_ACCEPT(PRFileDesc *fd, PRNetAddr *raddr, PRUint32 *rlen, _native_thread_io_nowait(me, rv, bytes); } else if (_NT_IO_WAIT(me, timeout) == PR_FAILURE) { PR_ASSERT(0); + closesocket(accept_sock); return -1; } PR_ASSERT(me->io_pending == PR_FALSE || me->io_suspended == PR_TRUE); if (me->io_suspended) { + closesocket(accept_sock); if (_PR_PENDING_INTERRUPT(me)) { me->flags &= ~_PR_INTERRUPT; PR_SetError(PR_PENDING_INTERRUPT_ERROR, 0); @@ -1385,6 +1389,7 @@ _PR_MD_FAST_ACCEPT(PRFileDesc *fd, PRNetAddr *raddr, PRUint32 *rlen, } if (me->md.blocked_io_status == 0) { + closesocket(accept_sock); _PR_MD_MAP_ACCEPTEX_ERROR(me->md.blocked_io_error); return -1; } @@ -1450,6 +1455,7 @@ _PR_MD_FAST_ACCEPT_READ(PRFileDesc *sd, PRInt32 *newSock, PRNetAddr **raddr, me->flags &= ~_PR_INTERRUPT; PR_SetError(PR_PENDING_INTERRUPT_ERROR, 0); _PR_THREAD_UNLOCK(me); + closesocket(*newSock); return -1; } me->io_pending = PR_TRUE; @@ -1467,6 +1473,7 @@ _PR_MD_FAST_ACCEPT_READ(PRFileDesc *sd, PRInt32 *newSock, PRNetAddr **raddr, &(me->md.overlapped.overlapped)); if ( (rv == 0) && ((err = GetLastError()) != ERROR_IO_PENDING)) { + closesocket(*newSock); _PR_THREAD_LOCK(me); me->io_pending = PR_FALSE; me->state = _PR_RUNNING; @@ -1486,6 +1493,7 @@ _PR_MD_FAST_ACCEPT_READ(PRFileDesc *sd, PRInt32 *newSock, PRNetAddr **raddr, _native_thread_io_nowait(me, rv, bytes); } else if (_NT_IO_WAIT(me, timeout) == PR_FAILURE) { PR_ASSERT(0); + closesocket(*newSock); return -1; } @@ -1515,8 +1523,10 @@ retry: callback(callbackArg); madeCallback = PR_TRUE; me->state = _PR_IO_WAIT; - if (_NT_ResumeIO(me, timeout) == PR_FAILURE) + if (_NT_ResumeIO(me, timeout) == PR_FAILURE) { + closesocket(*newSock); return -1; + } goto retry; } @@ -1524,8 +1534,10 @@ retry: /* Socket is connected but time not elapsed, RESUME IO */ timeout -= elapsed; me->state = _PR_IO_WAIT; - if (_NT_ResumeIO(me, timeout) == PR_FAILURE) + if (_NT_ResumeIO(me, timeout) == PR_FAILURE) { + closesocket(*newSock); return -1; + } goto retry; } } else { @@ -1552,6 +1564,7 @@ retry: PR_SetError(PR_IO_TIMEOUT_ERROR, 0); } me->state = _PR_RUNNING; + closesocket(*newSock); return -1; } |