aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTom Hacohen <tom@stosb.com>2016-02-05 11:48:36 +0000
committerTom Hacohen <tom@stosb.com>2016-02-05 11:48:36 +0000
commitd4bd7d70334baf2057b05e6f988103a295979673 (patch)
tree9ccfcc17989a3bc8c888f63448ce55df7ae1143a
parentEcore con: Close server socket fd on failure. (diff)
downloadefl-d4bd7d70334baf2057b05e6f988103a295979673.tar.gz
Ecore con local: properly clean up fd on error.
This wasn't done correctly in the previous commit. First of all, the order of cleanup was wrong, the cleanup area should only be called if failures occurred after the fd allocation, not before. Also, fd should be reinitialised to -1 once we close the socket.
-rw-r--r--src/lib/ecore_con/ecore_con_local.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/src/lib/ecore_con/ecore_con_local.c b/src/lib/ecore_con/ecore_con_local.c
index 20ede37bcc..246b133e6a 100644
--- a/src/lib/ecore_con/ecore_con_local.c
+++ b/src/lib/ecore_con/ecore_con_local.c
@@ -366,16 +366,16 @@ start:
goto error_umask;
if (fcntl(svr->fd, F_SETFL, O_NONBLOCK) < 0)
- goto error_umask;
+ goto error_fd;
if (fcntl(svr->fd, F_SETFD, FD_CLOEXEC) < 0)
- goto error_umask;
+ goto error_fd;
lin.l_onoff = 1;
lin.l_linger = 0;
if (setsockopt(svr->fd, SOL_SOCKET, SO_LINGER, (const void *)&lin,
sizeof(struct linger)) < 0)
- goto error_umask;
+ goto error_fd;
if (bind(svr->fd, (struct sockaddr *)&socket_unix, socket_unix_len) < 0)
{
@@ -391,13 +391,13 @@ start:
else
{
ERR("Local socket '%s' removal failed: %s", buf, strerror(errno));
- goto error_umask;
+ goto error_fd;
}
}
}
if (listen(svr->fd, 4096) < 0)
- goto error_umask;
+ goto error_fd;
#ifdef HAVE_SYSTEMD
fd_ready:
@@ -415,10 +415,12 @@ fd_ready:
return 1;
+error_fd:
+ close(svr->fd);
+ svr->fd = -1;
error_umask:
umask(pmode);
error:
- close(svr->fd);
#endif /* HAVE_LOCAL_SOCKETS */
return 0;
}