aboutsummaryrefslogtreecommitdiffstats
path: root/erts/epmd/src/epmd_srv.c
diff options
context:
space:
mode:
authorMichael Santos <[email protected]>2010-03-20 21:30:32 -0400
committerBjörn Gustavsson <[email protected]>2010-05-03 11:59:42 +0200
commitcfdd0e536c1f60ee649d1ffbb9ce2096e4e1a307 (patch)
tree47b490663dd4874e5d879df732f0e18b792b89b7 /erts/epmd/src/epmd_srv.c
parent3a68c36ca7aed71d643ea29460e36fec7e56817d (diff)
downloadotp-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/src/epmd_srv.c')
-rw-r--r--erts/epmd/src/epmd_srv.c19
1 files changed, 17 insertions, 2 deletions
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);