From: Vsevolod Stakhov Date: Tue, 24 Mar 2009 17:19:22 +0000 (+0300) Subject: * Fix multiply accept issues X-Git-Tag: 0.2.7~231 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f592edf20b6d91fb6c25d9d3b1021d2ab4c5fcb3;p=thirdparty%2Frspamd.git * Fix multiply accept issues --- diff --git a/src/util.c b/src/util.c index c4e85294af..1fdd2758ad 100644 --- a/src/util.c +++ b/src/util.c @@ -43,7 +43,7 @@ make_socket_nonblocking (int fd) int make_tcp_socket (struct in_addr *addr, u_short port, gboolean is_server) { - int fd, r, optlen, s_error; + int fd, r, optlen, on = 1, s_error; int serrno; struct sockaddr_in sin; @@ -70,6 +70,7 @@ make_tcp_socket (struct in_addr *addr, u_short port, gboolean is_server) sin.sin_addr.s_addr = addr->s_addr; if (is_server) { + setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, (const void *) &on, sizeof(int)); r = bind (fd, (struct sockaddr *)&sin, sizeof (struct sockaddr_in)); } else { @@ -109,6 +110,9 @@ accept_from_socket (int listen_sock, struct sockaddr *addr, socklen_t *len) int serrno; if ((nfd = accept (listen_sock, addr, len)) == -1) { + if (errno == EAGAIN) { + return 0; + } msg_warn ("accept_from_socket: accept failed: %d, '%s'", errno, strerror (errno)); return -1; } @@ -122,6 +126,8 @@ accept_from_socket (int listen_sock, struct sockaddr *addr, socklen_t *len) goto out; } + + return (nfd); out: @@ -136,7 +142,7 @@ int make_unix_socket (const char *path, struct sockaddr_un *addr, gboolean is_server) { size_t len = strlen (path); - int fd, s_error, r, optlen, serrno; + int fd, s_error, r, optlen, serrno, on = 1; if (len > sizeof (addr->sun_path) - 1) return -1; @@ -165,6 +171,7 @@ make_unix_socket (const char *path, struct sockaddr_un *addr, gboolean is_server goto out; } if (is_server) { + setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, (const void *) &on, sizeof(int)); r = bind (fd, (struct sockaddr *)&sin, sizeof (struct sockaddr_in)); } else { diff --git a/src/worker.c b/src/worker.c index 4d6c2bacc0..bf5dfa1591 100644 --- a/src/worker.c +++ b/src/worker.c @@ -232,6 +232,11 @@ accept_socket (int fd, short what, void *arg) msg_warn ("accept_socket: accept failed: %s", strerror (errno)); return; } + /* Check for EAGAIN */ + if (nfd == 0) { + msg_debug ("accept_socket: cannot accept socket as it was already accepted by other worker"); + return; + } if (ss.ss_family == AF_UNIX) { msg_info ("accept_socket: accepted connection from unix socket");