Don't leak socket fd on connection error

Signed-off-by: Kairui Song <kasong@redhat.com>
This commit is contained in:
Kairui Song 2018-11-05 17:18:49 +08:00
parent e783d132e9
commit f2623176c2
2 changed files with 5 additions and 3 deletions

View file

@ -376,7 +376,7 @@ gboolean sock_handle(gint fd, GIOCondition condition, gpointer user_data __attri
} }
if ((recv_size = recvmsg(sock, &msg, 0)) < 0) { if ((recv_size = recvmsg(sock, &msg, 0)) < 0) {
log(TO_ALL, LOG_WARNING, "Error while receiving data.\n"); log(TO_ALL, LOG_WARNING, "Error while receiving data.\n");
goto out; goto out_close;
} }
cmsg = CMSG_FIRSTHDR(&msg); cmsg = CMSG_FIRSTHDR(&msg);
if ((cmsg->cmsg_level == SOL_SOCKET) && if ((cmsg->cmsg_level == SOL_SOCKET) &&
@ -388,7 +388,7 @@ gboolean sock_handle(gint fd, GIOCondition condition, gpointer user_data __attri
} }
if (!valid_user) { if (!valid_user) {
log(TO_ALL, LOG_INFO, "Permission denied for user to connect to socket.\n"); log(TO_ALL, LOG_INFO, "Permission denied for user to connect to socket.\n");
goto out; goto out_close;
} }
if (!strncmp(buff, "stats", strlen("stats"))) { if (!strncmp(buff, "stats", strlen("stats"))) {
@ -421,7 +421,7 @@ gboolean sock_handle(gint fd, GIOCondition condition, gpointer user_data __attri
need_rescan = 1; need_rescan = 1;
if (!strncmp(irq_string, "NONE", strlen("NONE"))) { if (!strncmp(irq_string, "NONE", strlen("NONE"))) {
free(irq_string); free(irq_string);
goto out; goto out_close;
} }
int irq = strtoul(irq_string, &end, 10); int irq = strtoul(irq_string, &end, 10);
do { do {
@ -457,6 +457,7 @@ gboolean sock_handle(gint fd, GIOCondition condition, gpointer user_data __attri
free(setup); free(setup);
} }
out_close:
close(sock); close(sock);
} }

View file

@ -66,6 +66,7 @@ int init_connection()
memset(&addr, 0, sizeof(struct sockaddr_un)); memset(&addr, 0, sizeof(struct sockaddr_un));
addr.sun_family = AF_UNIX; addr.sun_family = AF_UNIX;
if (connect(socket_fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) { if (connect(socket_fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
close(socket_fd);
return 0; return 0;
} }