From 06ce139fd4d2cb18090442ce4c7c3992bf26f9a8 Mon Sep 17 00:00:00 2001 From: Emil Renner Berthing Date: Tue, 29 Jan 2013 14:16:16 +0100 Subject: io: fix filedescriptor leak on FreeBSD/OSX --- lem/io/core.c | 13 ++++++------- lem/io/tcp.c | 28 ++++++++++++++++------------ lem/io/unix.c | 25 +++++++++++++++---------- 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); -- cgit v1.2.1