From dc7661af5eb205403c395ae2abe8a54ebf2bfe6f Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Wed, 30 Jun 2004 23:28:06 +0000 Subject: [PATCH] 1681. [bug] Only set SO_REUSEADDR when a port is specified in isc_socket_bind(). [RT #11742] --- CHANGES | 3 +++ lib/isc/unix/socket.c | 10 +++++++--- lib/isc/win32/socket.c | 8 ++++++-- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/CHANGES b/CHANGES index bcbbb6364d..4e6140138c 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,6 @@ +1681. [bug] Only set SO_REUSEADDR when a port is specified in + isc_socket_bind(). [RT #11742] + 1679. [bug] When there was a single nameserver with multiple addresses for a zone not all addresses were tried. [RT #11706] diff --git a/lib/isc/unix/socket.c b/lib/isc/unix/socket.c index 33456240b0..5c54a3a31d 100644 --- a/lib/isc/unix/socket.c +++ b/lib/isc/unix/socket.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: socket.c,v 1.237.18.2 2004/04/19 03:02:23 marka Exp $ */ +/* $Id: socket.c,v 1.237.18.3 2004/06/30 23:28:05 marka Exp $ */ #include @@ -2859,8 +2859,12 @@ isc_socket_bind(isc_socket_t *sock, isc_sockaddr_t *sockaddr) { UNLOCK(&sock->lock); return (ISC_R_FAMILYMISMATCH); } - if (setsockopt(sock->fd, SOL_SOCKET, SO_REUSEADDR, (void *)&on, - sizeof(on)) < 0) { + /* + * Only set SO_REUSEADDR when we want a specific port. + */ + if (isc_sockaddr_getport(sockaddr) != (in_port_t)0 && + setsockopt(sock->fd, SOL_SOCKET, SO_REUSEADDR, (void *)&on, + sizeof(on)) < 0) { UNEXPECTED_ERROR(__FILE__, __LINE__, "setsockopt(%d) %s", sock->fd, isc_msgcat_get(isc_msgcat, ISC_MSGSET_GENERAL, diff --git a/lib/isc/win32/socket.c b/lib/isc/win32/socket.c index 2e9b1d041b..ff710194a8 100644 --- a/lib/isc/win32/socket.c +++ b/lib/isc/win32/socket.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: socket.c,v 1.30.18.3 2004/06/18 01:15:21 marka Exp $ */ +/* $Id: socket.c,v 1.30.18.4 2004/06/30 23:28:06 marka Exp $ */ /* This code has been rewritten to take advantage of Windows Sockets * I/O Completion Ports and Events. I/O Completion Ports is ONLY @@ -3225,7 +3225,11 @@ isc_socket_bind(isc_socket_t *sock, isc_sockaddr_t *sockaddr) { UNLOCK(&sock->lock); return (ISC_R_FAMILYMISMATCH); } - if (setsockopt(sock->fd, SOL_SOCKET, SO_REUSEADDR, (void *)&on, + /* + * Only set SO_REUSEADDR when we want a specific port. + */ + if (isc_sockaddr_getport(sockaddr) != (in_port_t)0 && + setsockopt(sock->fd, SOL_SOCKET, SO_REUSEADDR, (void *)&on, sizeof(on)) < 0) { UNEXPECTED_ERROR(__FILE__, __LINE__, "setsockopt(%d) %s", sock->fd,