aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorErlang/OTP <[email protected]>2010-05-10 04:29:39 +0000
committerErlang/OTP <[email protected]>2010-05-10 04:29:39 +0000
commit7fd4d8c8861ae3cf08a00610c71624aaf7fc16d7 (patch)
tree2f882876f100a727e3d21b0364ce5b0d4a2757cd
parenta21a9dac550bcb976fa074d7005499a4d6b55791 (diff)
parentcfdd0e536c1f60ee649d1ffbb9ce2096e4e1a307 (diff)
downloadotp-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.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);