aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXavier Del Campo Romero <xavi.dcr@tutanota.com>2023-05-01 03:06:34 +0200
committerXavier Del Campo Romero <xavi.dcr@tutanota.com>2023-05-01 04:13:25 +0200
commit9c7a2e91285ca91d500cc828ad041a264128db4d (patch)
tree0881cba35d5428877e5acfb5f42b05082c4cfbc3
parent7d1e41f9c51bc1525e5b0c86b9832562d65675c1 (diff)
downloadslcl-9c7a2e91285ca91d500cc828ad041a264128db4d.tar.gz
Avoid crashing on SIGPIPE
Under some circumstances, clients could cause SIGPIPE to slcl. Since this signal was not handled by server.c (i.e., via sigaction(3)), slcl would crash without any error messages printed to stderr. In such situation, SIGPIPE should not be usually considered a fatal error, so it is preferrable to close the connection and keep working.
-rw-r--r--http.c2
-rw-r--r--server.c20
2 files changed, 20 insertions, 2 deletions
diff --git a/http.c b/http.c
index 501499b..d843bb5 100644
--- a/http.c
+++ b/http.c
@@ -496,6 +496,8 @@ static int rw_error(const int r, bool *const close)
{
switch (errno)
{
+ case EPIPE:
+ /* Fall through. */
case ECONNRESET:
*close = true;
return 1;
diff --git a/server.c b/server.c
index a561bfb..afecf3a 100644
--- a/server.c
+++ b/server.c
@@ -167,7 +167,17 @@ static volatile sig_atomic_t do_exit;
static void handle_signal(const int signum)
{
- do_exit = 1;
+ switch (signum)
+ {
+ case SIGINT:
+ /* Fall through. */
+ case SIGTERM:
+ do_exit = 1;
+ break;
+
+ default:
+ break;
+ }
}
struct server_client *server_poll(struct server *const s, bool *const io,
@@ -286,7 +296,13 @@ static int init_signals(void)
}
else if (sigaction(SIGTERM, &sa, NULL))
{
- fprintf(stderr, "%s: sigaction(2) SIGINT: %s\n",
+ fprintf(stderr, "%s: sigaction(2) SIGTERM: %s\n",
+ __func__, strerror(errno));
+ return -1;
+ }
+ else if (sigaction(SIGPIPE, &sa, NULL))
+ {
+ fprintf(stderr, "%s: sigaction(2) SIGPIPE: %s\n",
__func__, strerror(errno));
return -1;
}