From d96f09c69037dc2437ff85d8311257b87aee38d3 Mon Sep 17 00:00:00 2001 From: David Goulet Date: Mon, 10 Dec 2012 11:20:30 -0500 Subject: [PATCH] Fix: Consumer sockets leak on error Signed-off-by: David Goulet --- src/common/consumer.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/common/consumer.c b/src/common/consumer.c index ef0d4b7bb..5dc1d92b4 100644 --- a/src/common/consumer.c +++ b/src/common/consumer.c @@ -2454,7 +2454,7 @@ end: */ void *consumer_thread_sessiond_poll(void *data) { - int sock, client_socket, ret; + int sock = -1, client_socket, ret; /* * structure to poll for incoming data on communication socket avoids * making blocking sockets. @@ -2514,6 +2514,13 @@ void *consumer_thread_sessiond_poll(void *data) goto end; } + /* This socket is not useful anymore. */ + ret = close(client_socket); + if (ret < 0) { + PERROR("close client_socket"); + } + client_socket = -1; + /* update the polling structure to poll on the established socket */ consumer_sockpoll[1].fd = sock; consumer_sockpoll[1].events = POLLIN | POLLPRI; @@ -2557,6 +2564,20 @@ end: */ notify_thread_pipe(ctx->consumer_data_pipe[1]); + /* Cleaning up possibly open sockets. */ + if (sock >= 0) { + ret = close(sock); + if (ret < 0) { + PERROR("close sock sessiond poll"); + } + } + if (client_socket >= 0) { + ret = close(sock); + if (ret < 0) { + PERROR("close client_socket sessiond poll"); + } + } + rcu_unregister_thread(); return NULL; } -- 2.34.1