summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEmil Renner Berthing <esmil@mailme.dk>2013-01-29 14:16:16 +0100
committerEmil Renner Berthing <esmil@mailme.dk>2013-01-29 14:18:20 +0100
commit06ce139fd4d2cb18090442ce4c7c3992bf26f9a8 (patch)
tree50ee9aaa58610d028cb14d9148ae7a578e49a7eb
parented8fe903ec2344a341eefdfaa117a6b937d4b3bc (diff)
downloadlem-06ce139fd4d2cb18090442ce4c7c3992bf26f9a8.tar.gz
lem-06ce139fd4d2cb18090442ce4c7c3992bf26f9a8.tar.xz
lem-06ce139fd4d2cb18090442ce4c7c3992bf26f9a8.zip
io: fix filedescriptor leak on FreeBSD/OSX
-rw-r--r--lem/io/core.c13
-rw-r--r--lem/io/tcp.c28
-rw-r--r--lem/io/unix.c25
3 files changed, 37 insertions, 29 deletions
diff --git a/lem/io/core.c b/lem/io/core.c
index b282583..15ebd8d 100644
--- a/lem/io/core.c
+++ b/lem/io/core.c
@@ -127,16 +127,15 @@ io_open_work(struct lem_async *a)
#endif
| O_NONBLOCK, o->fd >= 0 ? o->fd :
S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
- if (fd < 0
-#ifndef O_CLOXEC
- || fcntl(fd, F_SETFD, FD_CLOEXEC) == -1
-#endif
- ) {
+ if (fd < 0) {
o->flags = -errno;
return;
}
-
- if (fstat(fd, &st)) {
+ if (
+#ifndef O_CLOXEC
+ fcntl(fd, F_SETFD, FD_CLOEXEC) == -1 ||
+#endif
+ fstat(fd, &st)) {
o->flags = -errno;
close(fd);
return;
diff --git a/lem/io/tcp.c b/lem/io/tcp.c
index 20c4ab6..b11d59b 100644
--- a/lem/io/tcp.c
+++ b/lem/io/tcp.c
@@ -66,11 +66,7 @@ tcp_connect_work(struct lem_async *a)
addr->ai_socktype, addr->ai_protocol);
lem_debug("addr->ai_family = %d, sock = %d", addr->ai_family, sock);
- if (sock < 0
-#ifndef SOCK_CLOEXEC
- || fcntl(sock, F_SETFD, FD_CLOEXEC) == -1
-#endif
- ) {
+ if (sock < 0) {
int err = errno;
if (err == EAFNOSUPPORT || err == EPROTONOSUPPORT)
@@ -80,7 +76,13 @@ tcp_connect_work(struct lem_async *a)
g->err = err;
goto out;
}
-
+#ifndef SOCK_CLOEXEC
+ if (fcntl(sock, F_SETFD, FD_CLOEXEC) == -1) {
+ g->sock = -2;
+ g->err = errno;
+ goto error;
+ }
+#endif
/* connect */
if (connect(sock, addr->ai_addr, addr->ai_addrlen)) {
close(sock);
@@ -194,16 +196,18 @@ tcp_listen_work(struct lem_async *a)
#endif
addr->ai_socktype, addr->ai_protocol);
lem_debug("addr->ai_family = %d, sock = %d", addr->ai_family, sock);
- if (sock < 0
-#ifndef SOCK_CLOEXEC
- || fcntl(sock, F_SETFD, FD_CLOEXEC) == -1
-#endif
- ) {
+ if (sock < 0) {
g->sock = -2;
g->err = errno;
goto out;
}
-
+#ifndef SOCK_CLOEXEC
+ if (fcntl(sock, F_SETFD, FD_CLOEXEC) == -1) {
+ g->sock = -2;
+ g->err = errno;
+ goto error;
+ }
+#endif
/* set SO_REUSEADDR option if possible */
ret = 1;
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &ret, sizeof(int));
diff --git a/lem/io/unix.c b/lem/io/unix.c
index 0b18432..0a59d3d 100644
--- a/lem/io/unix.c
+++ b/lem/io/unix.c
@@ -36,16 +36,18 @@ unix_connect_work(struct lem_async *a)
SOCK_CLOEXEC |
#endif
SOCK_STREAM, 0);
- if (sock < 0
-#ifndef SOCK_CLOEXEC
- || fcntl(sock, F_SETFD, FD_CLOEXEC) == -1
-#endif
- ) {
+ if (sock < 0) {
u->sock = -1;
u->err = errno;
return;
}
-
+#ifndef SOCK_CLOEXEC
+ if (fcntl(sock, F_SETFD, FD_CLOEXEC) == -1) {
+ u->sock = -1;
+ u->err = errno;
+ goto error;
+ }
+#endif
addr.sun_family = AF_UNIX;
memcpy(addr.sun_path, u->path, u->len+1);
@@ -133,15 +135,18 @@ unix_listen_work(struct lem_async *a)
#endif
SOCK_STREAM, 0);
if (sock < 0
-#ifndef SOCK_CLOEXEC
- || fcntl(sock, F_SETFD, FD_CLOEXEC) == -1
-#endif
) {
u->sock = -1;
u->err = errno;
return;
}
-
+#ifndef SOCK_CLOEXEC
+ if (fcntl(sock, F_SETFD, FD_CLOEXEC) == -1) {
+ u->sock = -1;
+ u->err = errno;
+ goto error;
+ }
+#endif
addr.sun_family = AF_UNIX;
memcpy(addr.sun_path, u->path, u->len+1);