aboutsummaryrefslogtreecommitdiffstats
path: root/erts/epmd
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
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')
-rw-r--r--erts/epmd/src/epmd_int.h4
-rw-r--r--erts/epmd/src/epmd_srv.c19
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);