From 47bc6d534102aca9cc2aed1b6bdd5633ef645a3f Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Fri, 24 May 2019 10:27:25 +0200 Subject: [PATCH] aserver: fix resource leak coverity Signed-off-by: Jaroslav Kysela --- aserver/aserver.c | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/aserver/aserver.c b/aserver/aserver.c index 066414d8..6d20f330 100644 --- a/aserver/aserver.c +++ b/aserver/aserver.c @@ -75,6 +75,7 @@ static int make_local_socket(const char *filename) if (bind(sock, (struct sockaddr *) addr, size) < 0) { int result = -errno; SYSERROR("bind failed"); + close(sock); return result; } @@ -101,6 +102,7 @@ static int make_inet_socket(int port) if (bind(sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) { int result = -errno; SYSERROR("bind failed"); + close(sock); return result; } @@ -916,10 +918,9 @@ static int inet_handler(waiter_t *waiter, unsigned short events ATTRIBUTE_UNUSED static int server(const char *sockname, int port) { - int err; + int err, result, sockn = -1, socki = -1; unsigned int k; long open_max; - int result; if (!sockname && port < 0) return -EINVAL; @@ -933,36 +934,36 @@ static int server(const char *sockname, int port) waiters = calloc((size_t) open_max, sizeof(*waiters)); if (sockname) { - int sock = make_local_socket(sockname); - if (sock < 0) - return sock; - if (fcntl(sock, F_SETFL, O_NONBLOCK) < 0) { + sockn = make_local_socket(sockname); + if (sockn < 0) + return sockn; + if (fcntl(sockn, F_SETFL, O_NONBLOCK) < 0) { result = -errno; SYSERROR("fcntl O_NONBLOCK failed"); goto _end; } - if (listen(sock, 4) < 0) { + if (listen(sockn, 4) < 0) { result = -errno; SYSERROR("listen failed"); goto _end; } - add_waiter(sock, POLLIN, local_handler, NULL); + add_waiter(sockn, POLLIN, local_handler, NULL); } if (port >= 0) { - int sock = make_inet_socket(port); - if (sock < 0) - return sock; - if (fcntl(sock, F_SETFL, O_NONBLOCK) < 0) { + socki = make_inet_socket(port); + if (socki < 0) + return socki; + if (fcntl(socki, F_SETFL, O_NONBLOCK) < 0) { result = -errno; SYSERROR("fcntl failed"); goto _end; } - if (listen(sock, 4) < 0) { + if (listen(socki, 4) < 0) { result = -errno; SYSERROR("listen failed"); goto _end; } - add_waiter(sock, POLLIN, inet_handler, NULL); + add_waiter(socki, POLLIN, inet_handler, NULL); } while (1) { @@ -991,6 +992,10 @@ static int server(const char *sockname, int port) } } _end: + if (sockn >= 0) + close(sockn); + if (socki >= 0) + close(socki); free(pollfds); free(waiters); return result; -- 2.47.1