From 9aa7706900e2451fcd6e44ffe4a45b042ec34cf3 Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Wed, 30 Jun 2004 23:35:17 +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, 15 insertions(+), 6 deletions(-) diff --git a/CHANGES b/CHANGES index 3b38bc7429..4d3a1cf68a 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,7 @@ 1682. [placeholder] rt5066a -1681. [placeholder] rt11742 +1681. [bug] Only set SO_REUSEADDR when a port is specified in + isc_socket_bind(). [RT #11742] 1680. [placeholder] rt11697 diff --git a/lib/isc/unix/socket.c b/lib/isc/unix/socket.c index 4c6734b0cb..ad9f4e6bcb 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.239 2004/04/19 02:53:05 marka Exp $ */ +/* $Id: socket.c,v 1.240 2004/06/30 23:35:16 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 5d2e8d976d..af18e1117e 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.33 2004/06/18 01:14:59 marka Exp $ */ +/* $Id: socket.c,v 1.34 2004/06/30 23:35:17 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,