From ba76b506f52e2dfa28cd9aa2b5d0aa729caa94a9 Mon Sep 17 00:00:00 2001 From: Daniel Balla Date: Tue, 31 Jul 2018 10:36:37 +0200 Subject: [PATCH] Fix broken pipe error in Jerry Debugger (#2427) This patch fixes an error caused by trying to send data to a closed socket. JerryScript-DCO-1.0-Signed-off-by: Daniel Balla dballa@inf.u-szeged.hu --- jerry-ext/debugger/debugger-tcp.c | 23 +++++++++++++++++------ jerry-port/default/default-io.c | 5 ++++- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/jerry-ext/debugger/debugger-tcp.c b/jerry-ext/debugger/debugger-tcp.c index 18e0d466c..866e15650 100644 --- a/jerry-ext/debugger/debugger-tcp.c +++ b/jerry-ext/debugger/debugger-tcp.c @@ -37,9 +37,9 @@ typedef struct * Log tcp error message. */ static void -jerryx_debugger_tcp_log_error (void) +jerryx_debugger_tcp_log_error (int err_val) { - JERRYX_ERROR_MSG ("Error: %s\n", strerror (errno)); + JERRYX_ERROR_MSG ("TCP Error: %s\n", strerror (err_val)); } /* jerryx_debugger_tcp_log_error */ /** @@ -76,6 +76,15 @@ jerryx_debugger_tcp_send (jerry_debugger_transport_header_t *header_p, /**< tcp do { + ssize_t is_err = recv (tcp_p->tcp_socket, NULL, 0, MSG_PEEK); + + if (is_err == 0) + { + int err_val = errno; + jerry_debugger_transport_close (); + jerryx_debugger_tcp_log_error (err_val); + return false; + } ssize_t sent_bytes = send (tcp_p->tcp_socket, message_p, message_length, 0); if (sent_bytes < 0) @@ -85,8 +94,9 @@ jerryx_debugger_tcp_send (jerry_debugger_transport_header_t *header_p, /**< tcp continue; } - jerryx_debugger_tcp_log_error (); + int err_val = errno; jerry_debugger_transport_close (); + jerryx_debugger_tcp_log_error (err_val); return false; } @@ -112,12 +122,13 @@ jerryx_debugger_tcp_receive (jerry_debugger_transport_header_t *header_p, /**< t ssize_t length = recv (tcp_p->tcp_socket, buffer_p, buffer_size, 0); - if (length < 0) + if (length <= 0) { - if (errno != EWOULDBLOCK) + if (errno != EWOULDBLOCK || length == 0) { - jerryx_debugger_tcp_log_error (); + int err_val = errno; jerry_debugger_transport_close (); + jerryx_debugger_tcp_log_error (err_val); return false; } length = 0; diff --git a/jerry-port/default/default-io.c b/jerry-port/default/default-io.c index 6ded52c41..6aab48bdb 100644 --- a/jerry-port/default/default-io.c +++ b/jerry-port/default/default-io.c @@ -91,7 +91,10 @@ jerry_port_log (jerry_log_level_t level, /**< message log level */ vsnprintf (buffer, (size_t) length + 1, format, args); fprintf (stderr, "%s", buffer); - jerry_debugger_send_output ((jerry_char_t *) buffer, (jerry_size_t) length, (uint8_t) (level + 2)); + if (jerry_debugger_transport_is_connected ()) + { + jerry_debugger_send_output ((jerry_char_t *) buffer, (jerry_size_t) length, (uint8_t) (level + 2)); + } #else /* If jerry-debugger isn't defined, libc is turned on */ vfprintf (stderr, format, args); #endif /* JERRY_DEBUGGER */