From 45e41b7ac1eebc6b75ba4303b0b70e6f80d6ea06 Mon Sep 17 00:00:00 2001 From: Miroslav Lichvar Date: Wed, 24 Jul 2019 11:46:39 +0200 Subject: [PATCH] socket: avoid unnecessary bind() call 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 | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/socket.c b/socket.c index 0c0409d..ecaadaa 100644 --- 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;