diff options
author | Dragana Damjanovic <dd.mozilla@gmail.com> | 2017-08-25 17:06:34 +0200 |
---|---|---|
committer | Dragana Damjanovic <dd.mozilla@gmail.com> | 2017-08-25 17:06:34 +0200 |
commit | 0c42dd072f41d31d1a03ea19bb5e6610f36b742b (patch) | |
tree | a2eada264b0e5b79e500c7b6046622be07a73941 | |
parent | ba45a539d8eae9e46788457db6a5ccf61c91a9de (diff) | |
download | nspr-hg-0c42dd072f41d31d1a03ea19bb5e6610f36b742b.tar.gz |
Bug 1386719 - If poll returns PR_POLL_EXCEPT during ConnectEx on windows check OVERLAPPED as well. r=mcmanus r=mayhemer
-rw-r--r-- | pr/src/io/prsocket.c | 16 | ||||
-rw-r--r-- | pr/src/md/windows/win32_errors.c | 8 |
2 files changed, 23 insertions, 1 deletions
diff --git a/pr/src/io/prsocket.c b/pr/src/io/prsocket.c index a24b8e1b..d043f35a 100644 --- a/pr/src/io/prsocket.c +++ b/pr/src/io/prsocket.c @@ -304,7 +304,21 @@ static PRStatus PR_CALLBACK SocketConnectContinue( if (err != 0) { _PR_MD_MAP_CONNECT_ERROR(err); } else { - PR_SetError(PR_UNKNOWN_ERROR, 0); + if (fd->secret->overlappedActive) { + PRInt32 rvSent; + if (GetOverlappedResult(osfd, &fd->secret->ol, &rvSent, FALSE) == FALSE) { + err = WSAGetLastError(); + PR_LOG(_pr_io_lm, PR_LOG_MIN, + ("SocketConnectContinue GetOverlappedResult failed %d\n", err)); + if (err != ERROR_IO_INCOMPLETE) { + _PR_MD_MAP_CONNECT_ERROR(err); + fd->secret->overlappedActive = PR_FALSE; + } + } + } + if (err == 0) { + PR_SetError(PR_UNKNOWN_ERROR, 0); + } } return PR_FAILURE; } diff --git a/pr/src/md/windows/win32_errors.c b/pr/src/md/windows/win32_errors.c index d26820a7..27579218 100644 --- a/pr/src/md/windows/win32_errors.c +++ b/pr/src/md/windows/win32_errors.c @@ -166,21 +166,26 @@ void _MD_win32_map_default_error(PRInt32 err) prError = PR_ADDRESS_IN_USE_ERROR; break; case WSAEADDRNOTAVAIL: + case ERROR_INVALID_NETNAME: prError = PR_ADDRESS_NOT_AVAILABLE_ERROR; break; case WSAEAFNOSUPPORT: + case ERROR_INCORRECT_ADDRESS: prError = PR_ADDRESS_NOT_SUPPORTED_ERROR; break; case WSAEALREADY: + case ERROR_ALREADY_INITIALIZED: prError = PR_ALREADY_INITIATED_ERROR; break; case WSAEBADF: prError = PR_BAD_DESCRIPTOR_ERROR; break; case WSAECONNABORTED: + case ERROR_CONNECTION_ABORTED: prError = PR_CONNECT_ABORTED_ERROR; break; case WSAECONNREFUSED: + case ERROR_CONNECTION_REFUSED: prError = PR_CONNECT_REFUSED_ERROR; break; case WSAECONNRESET: @@ -193,6 +198,7 @@ void _MD_win32_map_default_error(PRInt32 err) prError = PR_ACCESS_FAULT_ERROR; break; case WSAEHOSTUNREACH: + case ERROR_HOST_UNREACHABLE: prError = PR_HOST_UNREACHABLE_ERROR; break; case WSAEINVAL: @@ -208,12 +214,14 @@ void _MD_win32_map_default_error(PRInt32 err) prError = PR_BUFFER_OVERFLOW_ERROR; break; case WSAENETDOWN: + case ERROR_NO_NETWORK: prError = PR_NETWORK_DOWN_ERROR; break; case WSAENETRESET: prError = PR_CONNECT_ABORTED_ERROR; break; case WSAENETUNREACH: + case ERROR_NETWORK_UNREACHABLE: prError = PR_NETWORK_UNREACHABLE_ERROR; break; case WSAENOBUFS: |