diff --git a/lib/isc/unix/socket.c b/lib/isc/unix/socket.c index 3c5c68b298..e459efdb95 100644 --- a/lib/isc/unix/socket.c +++ b/lib/isc/unix/socket.c @@ -2050,15 +2050,13 @@ free_socket(isc__socket_t **socketp) { } #ifdef SO_RCVBUF -static isc_once_t rcvsndbuf_once = ISC_ONCE_INIT; +static isc_once_t rcvbuf_once = ISC_ONCE_INIT; static int rcvbuf = RCVBUFSIZE; -static int sndbuf = SNDBUFSIZE; static void -set_rcvsndbuf(void) { +set_rcvbuf(void) { int fd; - int maxrcv = rcvbuf, minrcv; - int maxsnd = sndbuf, minsnd; + int max = rcvbuf, min; ISC_SOCKADDR_LEN_T len; fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); @@ -2079,52 +2077,28 @@ set_rcvsndbuf(void) { if (fd == -1) return; - len = sizeof(minrcv); - while (getsockopt(fd, SOL_SOCKET, SO_RCVBUF, (void *)&minrcv, &len) == 0 && - minrcv < rcvbuf) { + len = sizeof(min); + if (getsockopt(fd, SOL_SOCKET, SO_RCVBUF, (void *)&min, &len) == 0 && + min < rcvbuf) { + again: if (setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (void *)&rcvbuf, sizeof(rcvbuf)) == -1) { - if (errno == ENOBUFS && rcvbuf > minrcv) { - maxrcv = rcvbuf - 1; - rcvbuf = (rcvbuf + minrcv) / 2; - continue; + if (errno == ENOBUFS && rcvbuf > min) { + max = rcvbuf - 1; + rcvbuf = (rcvbuf + min) / 2; + goto again; } else { - rcvbuf = minrcv; - break; + rcvbuf = min; + goto cleanup; } - } else { - minrcv = rcvbuf; - } - - if (minrcv != maxrcv) { - rcvbuf = maxrcv; - } else { - break; + } else + min = rcvbuf; + if (min != max) { + rcvbuf = max; + goto again; } } - while (getsockopt(fd, SOL_SOCKET, SO_SNDBUF, (void *)&minsnd, &len) == 0 && - minsnd < sndbuf) { - if (setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (void *)&sndbuf, - sizeof(sndbuf)) == -1) { - if (errno == ENOBUFS && sndbuf > minsnd) { - maxsnd = sndbuf - 1; - sndbuf = (sndbuf + minsnd) / 2; - continue; - } else { - sndbuf = minsnd; - break; - } - } else { - minsnd = sndbuf; - } - - if (minsnd != maxsnd) { - sndbuf = maxsnd; - } else { - break; - } - } - + cleanup: close (fd); } #endif @@ -2566,8 +2540,8 @@ opensocket(isc__socketmgr_t *manager, isc__socket_t *sock, optlen = sizeof(size); if (getsockopt(sock->fd, SOL_SOCKET, SO_RCVBUF, (void *)&size, &optlen) == 0 && size < rcvbuf) { - RUNTIME_CHECK(isc_once_do(&rcvsndbuf_once, - set_rcvsndbuf) == ISC_R_SUCCESS); + RUNTIME_CHECK(isc_once_do(&rcvbuf_once, + set_rcvbuf) == ISC_R_SUCCESS); if (setsockopt(sock->fd, SOL_SOCKET, SO_RCVBUF, (void *)&rcvbuf, sizeof(rcvbuf)) == -1) { strerror_r(errno, strbuf, sizeof(strbuf)); @@ -2581,23 +2555,6 @@ opensocket(isc__socketmgr_t *manager, isc__socket_t *sock, strbuf); } } - if (getsockopt(sock->fd, SOL_SOCKET, SO_SNDBUF, - (void *)&size, &optlen) == 0 && size < sndbuf) { - RUNTIME_CHECK(isc_once_do(&rcvsndbuf_once, - set_rcvsndbuf) == ISC_R_SUCCESS); - if (setsockopt(sock->fd, SOL_SOCKET, SO_SNDBUF, - (void *)&sndbuf, sizeof(sndbuf)) == -1) { - strerror_r(errno, strbuf, sizeof(strbuf)); - UNEXPECTED_ERROR(__FILE__, __LINE__, - "setsockopt(%d, SO_SNDBUF, %d) %s: %s", - sock->fd, sndbuf, - isc_msgcat_get(isc_msgcat, - ISC_MSGSET_GENERAL, - ISC_MSG_FAILED, - "failed"), - strbuf); - } - } #endif #if defined(SO_SNDBUF)