From: pcarana Date: Thu, 13 Aug 2020 21:42:25 +0000 (-0500) Subject: Close socket on error, log bind info one time only X-Git-Tag: v1.4.0^0 X-Git-Url: http://git.ipfire.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=940e79057dd27895a65917eb5febe9cc23c90fbd;p=thirdparty%2FFORT-validator.git Close socket on error, log bind info one time only --- diff --git a/src/rtr/rtr.c b/src/rtr/rtr.c index 469a33df..b1faf593 100644 --- a/src/rtr/rtr.c +++ b/src/rtr/rtr.c @@ -108,12 +108,13 @@ create_server_socket(char const *hostname, char const *service, int *result) if (error) return error; - for (addr = addrs; addr != NULL; addr = addr->ai_next) { + if (addrs != NULL) pr_op_info( "Attempting to bind socket to address '%s', port '%s'.", - (addr->ai_canonname != NULL) ? addr->ai_canonname : "any", + (addrs->ai_canonname != NULL) ? addrs->ai_canonname : "any", service); + for (addr = addrs; addr != NULL; addr = addr->ai_next) { fd = socket(addr->ai_family, SOCK_STREAM, 0); if (fd < 0) { pr_op_errno(errno, "socket() failed"); @@ -123,6 +124,7 @@ create_server_socket(char const *hostname, char const *service, int *result) flags = fcntl(fd, F_GETFL); if (flags == -1) { pr_op_errno(errno, "fcntl() to get flags failed"); + close(fd); continue; } @@ -131,6 +133,7 @@ create_server_socket(char const *hostname, char const *service, int *result) if (fcntl(fd, F_SETFL, flags) == -1) { pr_op_errno(errno, "fcntl() to set flags failed"); + close(fd); continue; } @@ -138,6 +141,7 @@ create_server_socket(char const *hostname, char const *service, int *result) if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(int)) < 0) { pr_op_errno(errno, "setsockopt(SO_REUSEADDR) failed"); + close(fd); continue; } @@ -145,11 +149,13 @@ create_server_socket(char const *hostname, char const *service, int *result) if (setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &reuse, sizeof(int)) < 0) { pr_op_errno(errno, "setsockopt(SO_REUSEPORT) failed"); + close(fd); continue; } if (bind(fd, addr->ai_addr, addr->ai_addrlen) < 0) { pr_op_errno(errno, "bind() failed"); + close(fd); continue; }