]> git.ipfire.org Git - thirdparty/chrony.git/commitdiff
socket: avoid unnecessary bind() call
authorMiroslav Lichvar <mlichvar@redhat.com>
Wed, 24 Jul 2019 09:46:39 +0000 (11:46 +0200)
committerMiroslav Lichvar <mlichvar@redhat.com>
Wed, 24 Jul 2019 14:27:07 +0000 (16:27 +0200)
Don't call bind() if the specified local address of a socket has port 0
and the "any" address. It will be bound automatically on connect() or
sendmsg().

socket.c

index 0c0409d9a832e484cfd48c46a3f96a4bff7184fb..ecaadaaa0bb284c0368c535dc6f108cc3fd67942 100644 (file)
--- a/socket.c
+++ b/socket.c
@@ -258,6 +258,18 @@ set_ip_options(int sock_fd, int family, int flags)
 
 /* ================================================== */
 
+static int
+is_any_address(IPAddr *addr)
+{
+  IPAddr any_addr;
+
+  SCK_GetAnyLocalIPAddress(addr->family, &any_addr);
+
+  return UTI_CompareIPs(&any_addr, addr, NULL) == 0;
+}
+
+/* ================================================== */
+
 static int
 bind_ip_address(int sock_fd, IPSockAddr *addr, int flags)
 {
@@ -352,8 +364,9 @@ open_ip_socket(IPSockAddr *remote_addr, IPSockAddr *local_addr, int type, int fl
   if (!set_ip_options(sock_fd, family, flags))
     goto error;
 
-  /* Bind the socket if a local address was specified */
+  /* Bind the socket if a non-any local address/port was specified */
   if (local_addr && local_addr->ip_addr.family != IPADDR_UNSPEC &&
+      (local_addr->port != 0 || !is_any_address(&local_addr->ip_addr)) &&
       !bind_ip_address(sock_fd, local_addr, flags))
     goto error;