mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-08-31 06:25:31 +00:00
netmgr: Don't crash if socket() returns an error in udpconnect
socket() call can return an error - e.g. EMFILE, so we need to handle this nicely and not crash. Additionally wrap the socket() call inside a platform independent helper function as the Socket data type on Windows is unsigned integer: > This means, for example, that checking for errors when the socket and > accept functions return should not be done by comparing the return > value with –1, or seeing if the value is negative (both common and > legal approaches in UNIX). Instead, an application should use the > manifest constant INVALID_SOCKET as defined in the Winsock2.h header > file.
This commit is contained in:
@@ -16,6 +16,7 @@
|
||||
#include <isc/atomic.h>
|
||||
#include <isc/buffer.h>
|
||||
#include <isc/condition.h>
|
||||
#include <isc/errno.h>
|
||||
#include <isc/magic.h>
|
||||
#include <isc/mem.h>
|
||||
#include <isc/netmgr.h>
|
||||
@@ -27,6 +28,7 @@
|
||||
#include <isc/result.h>
|
||||
#include <isc/sockaddr.h>
|
||||
#include <isc/stats.h>
|
||||
#include <isc/strerr.h>
|
||||
#include <isc/thread.h>
|
||||
#include <isc/util.h>
|
||||
|
||||
@@ -1722,6 +1724,40 @@ isc__nm_decstats(isc_nm_t *mgr, isc_statscounter_t counterid) {
|
||||
}
|
||||
}
|
||||
|
||||
isc_result_t
|
||||
isc__nm_socket(int domain, int type, int protocol, uv_os_sock_t *sockp) {
|
||||
#ifdef WIN32
|
||||
SOCKET sock;
|
||||
sock = socket(domain, type, protocol);
|
||||
if (sock == INVALID_SOCKET) {
|
||||
char strbuf[ISC_STRERRORSIZE];
|
||||
DWORD socket_errno = WSAGetLastError();
|
||||
switch (socket_errno) {
|
||||
case WSAEMFILE:
|
||||
case WSAENOBUFS:
|
||||
return (ISC_R_NORESOURCES);
|
||||
|
||||
case WSAEPROTONOSUPPORT:
|
||||
case WSAEPFNOSUPPORT:
|
||||
case WSAEAFNOSUPPORT:
|
||||
return (ISC_R_FAMILYNOSUPPORT);
|
||||
default:
|
||||
strerror_r(socket_errno, strbuf, sizeof(strbuf));
|
||||
UNEXPECTED_ERROR(__FILE__, __LINE__,
|
||||
"socket() failed: %s", strbuf);
|
||||
return (ISC_R_UNEXPECTED);
|
||||
}
|
||||
}
|
||||
#else
|
||||
int sock = socket(domain, type, protocol);
|
||||
if (sock < 0) {
|
||||
return (isc_errno_toresult(errno));
|
||||
}
|
||||
#endif
|
||||
*sockp = (uv_os_sock_t)sock;
|
||||
return (ISC_R_SUCCESS);
|
||||
}
|
||||
|
||||
#define setsockopt_on(socket, level, name) \
|
||||
setsockopt(socket, level, name, &(int){ 1 }, sizeof(int))
|
||||
|
||||
|
Reference in New Issue
Block a user