projects
/
lttng-tools.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix: FD leak on consumer add relayd socket error
[lttng-tools.git]
/
src
/
common
/
consumer.c
diff --git
a/src/common/consumer.c
b/src/common/consumer.c
index 5dc1d92b40685598e1c841b8d3128073aeed65ba..5766860a89823bf40c4ebd98448fc233e54c06f2 100644
(file)
--- 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)
{
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);
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;
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;
}
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);
/* 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) {
if (ret < 0) {
-
PERROR("close relayd control socket")
;
+
goto error
;
}
/* Assign new file descriptor */
}
/* 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);
/* 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) {
if (ret < 0) {
-
PERROR("close relayd control socket")
;
+
goto error
;
}
/* Assign new file descriptor */
}
/* 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! */
add_relayd(relayd);
/* All good! */
- ret
=
0;
+ ret
urn
0;
error:
error:
+ /* Close received socket if valid. */
+ if (fd >= 0) {
+ if (close(fd)) {
+ PERROR("close received socket");
+ }
+ }
return ret;
}
return ret;
}
This page took
0.025122 seconds
and
4
git commands to generate.