diff options
author | Erlang/OTP <[email protected]> | 2010-05-10 04:29:39 +0000 |
---|---|---|
committer | Erlang/OTP <[email protected]> | 2010-05-10 04:29:39 +0000 |
commit | 7fd4d8c8861ae3cf08a00610c71624aaf7fc16d7 (patch) | |
tree | 2f882876f100a727e3d21b0364ce5b0d4a2757cd | |
parent | a21a9dac550bcb976fa074d7005499a4d6b55791 (diff) | |
parent | cfdd0e536c1f60ee649d1ffbb9ce2096e4e1a307 (diff) | |
download | otp-7fd4d8c8861ae3cf08a00610c71624aaf7fc16d7.tar.gz otp-7fd4d8c8861ae3cf08a00610c71624aaf7fc16d7.tar.bz2 otp-7fd4d8c8861ae3cf08a00610c71624aaf7fc16d7.zip |
Merge branch 'ms/epmd-error-checking' into dev
* ms/epmd-error-checking:
Exit if an error occurs with the listening socket
OTP-8618 ms/epmd-error-checking
The empd program could loop and consume 100% CPU time if an unexpected
error ocurred in listen() or accept(). Now epmd will terminate if a
non-recoverable error occurs. (Thanks to Michael Santos.)
-rw-r--r-- | erts/epmd/src/epmd_int.h | 4 | ||||
-rw-r--r-- | erts/epmd/src/epmd_srv.c | 19 |
2 files changed, 21 insertions, 2 deletions
diff --git a/erts/epmd/src/epmd_int.h b/erts/epmd/src/epmd_int.h index 84578c72f8..5ead553f36 100644 --- a/erts/epmd/src/epmd_int.h +++ b/erts/epmd/src/epmd_int.h @@ -141,6 +141,10 @@ # define EADDRINUSE WSAEADDRINUSE #endif +#if defined(__WIN32__) && !defined(ECONNABORTED) +# define ECONNABORTED WSAECONNABORTED +#endif + #ifndef SOMAXCONN # define SOMAXCONN 128 #endif diff --git a/erts/epmd/src/epmd_srv.c b/erts/epmd/src/epmd_srv.c index 021f8207eb..34f657fb16 100644 --- a/erts/epmd/src/epmd_srv.c +++ b/erts/epmd/src/epmd_srv.c @@ -210,8 +210,16 @@ void run(EpmdVars *g) timeout.tv_sec = (g->packet_timeout < IDLE_TIMEOUT) ? 1 : IDLE_TIMEOUT; timeout.tv_usec = 0; - if ((ret = select(g->max_conn,&read_mask,(fd_set *)0,(fd_set *)0,&timeout)) < 0) + if ((ret = select(g->max_conn,&read_mask,(fd_set *)0,(fd_set *)0,&timeout)) < 0) { dbg_perror(g,"error in select "); + switch (errno) { + case EAGAIN: + case EINTR: + break; + default: + epmd_cleanup_exit(g,1); + } + } else { time_t now; if (ret == 0) { @@ -384,7 +392,14 @@ static int do_accept(EpmdVars *g,int listensock) if (msgsock < 0) { dbg_perror(g,"error in accept"); - return EPMD_FALSE; + switch (errno) { + case EAGAIN: + case ECONNABORTED: + case EINTR: + return EPMD_FALSE; + default: + epmd_cleanup_exit(g,1); + } } return conn_open(g,msgsock); |