From ae8d3bc9b32e95ce6f9a2da3b6ae961f04071c36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20H=C3=B6gberg?= Date: Thu, 1 Jun 2017 10:13:51 +0200 Subject: Unconditionally clear IO buffers on send/shutdown errors This fixes a bug where a send/shutdown error on an active-mode socket results in the port never being properly closed. --- erts/emulator/drivers/common/inet_drv.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'erts/emulator') diff --git a/erts/emulator/drivers/common/inet_drv.c b/erts/emulator/drivers/common/inet_drv.c index 1885338ce5..ebd13e6f05 100644 --- a/erts/emulator/drivers/common/inet_drv.c +++ b/erts/emulator/drivers/common/inet_drv.c @@ -10386,6 +10386,9 @@ static int tcp_send_or_shutdown_error(tcp_descriptor* desc, int err) set_busy_port(desc->inet.port, 0); } + tcp_clear_output(desc); + tcp_clear_input(desc); + /* * We used to handle "expected errors" differently from unexpected ones. * Now we handle all errors in the same way (unless the show_econnreset @@ -10408,8 +10411,6 @@ static int tcp_send_or_shutdown_error(tcp_descriptor* desc, int err) else desc_close(INETP(desc)); } else { - tcp_clear_output(desc); - tcp_clear_input(desc); tcp_close_check(desc); erl_inet_close(INETP(desc)); -- cgit v1.2.3 From 8c807c89fd93ac60137c72ce597759b697ac0ec7 Mon Sep 17 00:00:00 2001 From: Lukas Larsson Date: Mon, 5 Jun 2017 15:55:31 +0200 Subject: erts: Fix so that 81b628 (sigterm=kill) works OTP-14451 --- erts/emulator/sys/unix/sys.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'erts/emulator') diff --git a/erts/emulator/sys/unix/sys.c b/erts/emulator/sys/unix/sys.c index de8481b206..7f738751ff 100644 --- a/erts/emulator/sys/unix/sys.c +++ b/erts/emulator/sys/unix/sys.c @@ -838,11 +838,13 @@ void sys_init_suspend_handler(void) void erts_sys_unix_later_init(void) { - char env[4]; + char env[5]; size_t envsz = sizeof(env); + if (erts_sys_getenv_raw("ERL_ZZ_SIGTERM_KILL", env, &envsz) == 0) - if (envsz == 4 && sys_strncmp("true",env,4) == 0) + if (envsz == 4 && sys_strncmp("true", env, 4) == 0) return; + sys_signal(SIGTERM, request_stop); } -- cgit v1.2.3