diff options
author | Michael Santos <[email protected]> | 2010-03-20 21:30:32 -0400 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2010-05-03 11:59:42 +0200 |
commit | cfdd0e536c1f60ee649d1ffbb9ce2096e4e1a307 (patch) | |
tree | 47b490663dd4874e5d879df732f0e18b792b89b7 /erts/epmd | |
parent | 3a68c36ca7aed71d643ea29460e36fec7e56817d (diff) | |
download | otp-cfdd0e536c1f60ee649d1ffbb9ce2096e4e1a307.tar.gz otp-cfdd0e536c1f60ee649d1ffbb9ce2096e4e1a307.tar.bz2 otp-cfdd0e536c1f60ee649d1ffbb9ce2096e4e1a307.zip |
Exit if an error occurs with the listening socket
Check errno if either select() or accept() returns an error and exit.
This prevents epmd from looping and taking up 100% CPU.
Diffstat (limited to 'erts/epmd')
-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); |