diff options
author | Lukas Larsson <[email protected]> | 2016-09-05 17:24:53 +0200 |
---|---|---|
committer | Lukas Larsson <[email protected]> | 2016-09-05 17:24:53 +0200 |
commit | 017725fc8a7d1d45eb1c9579b5cd0996d46c11a2 (patch) | |
tree | cf1875384d0d75a0461661b7a9eada3be9b1699d /erts/emulator/sys/unix/erl_child_setup.c | |
parent | cf88d37535e889adb5252c4110d53f5a4fd7f5b9 (diff) | |
parent | 2c9f81b8b030062fb7cbfc4250b2069f73e57cc8 (diff) | |
download | otp-017725fc8a7d1d45eb1c9579b5cd0996d46c11a2.tar.gz otp-017725fc8a7d1d45eb1c9579b5cd0996d46c11a2.tar.bz2 otp-017725fc8a7d1d45eb1c9579b5cd0996d46c11a2.zip |
Merge branch 'maint'
Diffstat (limited to 'erts/emulator/sys/unix/erl_child_setup.c')
-rw-r--r-- | erts/emulator/sys/unix/erl_child_setup.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/erts/emulator/sys/unix/erl_child_setup.c b/erts/emulator/sys/unix/erl_child_setup.c index 6b9ddd8da4..69fc6c2879 100644 --- a/erts/emulator/sys/unix/erl_child_setup.c +++ b/erts/emulator/sys/unix/erl_child_setup.c @@ -348,7 +348,7 @@ child_error: * for posterity. */ static void handle_sigchld(int sig) { - int buff[2], res; + int buff[2], res, __preverrno = errno; sys_sigblock(SIGCHLD); @@ -362,6 +362,16 @@ static void handle_sigchld(int sig) { } sys_sigrelease(SIGCHLD); + + /* We save and restore the original errno as otherwise + the thread we are running in may end up with an + unexpected errno. An example of when this happened + was when the select in main had gotten an EINTR but + before the errno was checked the signal handler + was called and set errno to ECHILD from waitpid + which caused erl_child_setup to abort as it does + not expect ECHILD to be set after select */ + errno = __preverrno; } #if defined(__ANDROID__) @@ -423,7 +433,7 @@ main(int argc, char *argv[]) sigemptyset(&sa.sa_mask); sa.sa_flags = SA_RESTART | SA_NOCLDSTOP; if (sigaction(SIGCHLD, &sa, 0) == -1) { - perror(0); + perror(NULL); exit(1); } |