From: David Goulet Date: Mon, 10 Dec 2012 16:38:35 +0000 (-0500) Subject: Fix: FD leak on consumer add relayd socket error X-Git-Tag: v2.1.0~72 X-Git-Url: https://git.lttng.org./?a=commitdiff_plain;h=4028eeb991f5fc7e430ce09036f57bfbaa59a664;p=lttng-tools.git Fix: FD leak on consumer add relayd socket error Signed-off-by: David Goulet --- diff --git a/src/common/consumer.c b/src/common/consumer.c index 5dc1d92b4..5766860a8 100644 --- a/src/common/consumer.c +++ b/src/common/consumer.c @@ -2648,7 +2648,7 @@ int consumer_add_relayd_socket(int net_seq_idx, int sock_type, struct lttng_consumer_local_data *ctx, int sock, struct pollfd *consumer_sockpoll, struct lttcomm_sock *relayd_sock) { - int fd, ret = -1; + int fd = -1, ret = -1; struct consumer_relayd_sock_pair *relayd; DBG("Consumer adding relayd socket (idx: %d)", net_seq_idx); @@ -2675,6 +2675,7 @@ int consumer_add_relayd_socket(int net_seq_idx, int sock_type, if (ret != sizeof(fd)) { lttng_consumer_send_error(ctx, LTTCOMM_CONSUMERD_ERROR_RECV_FD); ret = -1; + fd = -1; /* Just in case it gets set with an invalid value. */ goto error; } @@ -2684,14 +2685,15 @@ int consumer_add_relayd_socket(int net_seq_idx, int sock_type, /* Copy received lttcomm socket */ lttcomm_copy_sock(&relayd->control_sock, relayd_sock); ret = lttcomm_create_sock(&relayd->control_sock); - if (ret < 0) { - goto error; + /* Immediately try to close the created socket if valid. */ + if (relayd->control_sock.fd >= 0) { + if (close(relayd->control_sock.fd)) { + PERROR("close relayd control socket"); + } } - - /* Close the created socket fd which is useless */ - ret = close(relayd->control_sock.fd); + /* Handle create_sock error. */ if (ret < 0) { - PERROR("close relayd control socket"); + goto error; } /* Assign new file descriptor */ @@ -2701,14 +2703,15 @@ int consumer_add_relayd_socket(int net_seq_idx, int sock_type, /* Copy received lttcomm socket */ lttcomm_copy_sock(&relayd->data_sock, relayd_sock); ret = lttcomm_create_sock(&relayd->data_sock); - if (ret < 0) { - goto error; + /* Immediately try to close the created socket if valid. */ + if (relayd->data_sock.fd >= 0) { + if (close(relayd->data_sock.fd)) { + PERROR("close relayd data socket"); + } } - - /* Close the created socket fd which is useless */ - ret = close(relayd->data_sock.fd); + /* Handle create_sock error. */ if (ret < 0) { - PERROR("close relayd control socket"); + goto error; } /* Assign new file descriptor */ @@ -2730,9 +2733,15 @@ int consumer_add_relayd_socket(int net_seq_idx, int sock_type, add_relayd(relayd); /* All good! */ - ret = 0; + return 0; error: + /* Close received socket if valid. */ + if (fd >= 0) { + if (close(fd)) { + PERROR("close received socket"); + } + } return ret; }