From 371bff0d0707da36a6096bba1fb3812d382bcb4f Mon Sep 17 00:00:00 2001
From: Lorenz Stechauner <lorenz.stechauner@necronda.net>
Date: Wed, 5 Jul 2023 23:19:40 +0200
Subject: [PATCH] Fix async and FastCGI timeout issues

---
 src/async.c                  | 4 ++--
 src/lib/fastcgi.c            | 1 +
 src/worker/fastcgi_handler.c | 1 +
 3 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/src/async.c b/src/async.c
index 83cafbb..2f1c2a8 100644
--- a/src/async.c
+++ b/src/async.c
@@ -256,7 +256,7 @@ void async_thread(void) {
         min_ts = -1000, cur_ts = clock_micros();
         for (int i = 0; i < list_size(local); i++) {
             evt_listen_t *evt = local[i];
-            if (!evt->socket) continue;
+            if (!evt->socket || evt->socket->timeout_us < 0) continue;
 
             ts = evt->socket->ts_last + evt->socket->timeout_us - cur_ts;
             if (min_ts == -1000 || ts < min_ts) min_ts = ts;
@@ -307,7 +307,7 @@ void async_thread(void) {
             evt_listen_t *evt = local[i];
             if (!evt->socket) continue;
 
-            if ((cur_ts - evt->socket->ts_last) >= evt->socket->timeout_us) {
+            if (evt->socket->timeout_us >= 0 && (cur_ts - evt->socket->ts_last) >= evt->socket->timeout_us) {
                 evt->to_cb(evt->arg);
 
                 if (epoll_ctl(epoll_fd, EPOLL_CTL_DEL, evt->fd, NULL) == -1) {
diff --git a/src/lib/fastcgi.c b/src/lib/fastcgi.c
index d38def3..de8e935 100644
--- a/src/lib/fastcgi.c
+++ b/src/lib/fastcgi.c
@@ -195,6 +195,7 @@ int fastcgi_init(fastcgi_cnx_t *conn, int mode, unsigned int req_num, const sock
 
     conn->fd_out = pipes[1][1];
     conn->out.socket = pipes[1][0];
+    sock_set_timeout(&conn->out, FASTCGI_TIMEOUT);
 
     conn->fd_err = pipes[0][1];
     conn->err = fdopen(pipes[0][0], "r");
diff --git a/src/worker/fastcgi_handler.c b/src/worker/fastcgi_handler.c
index 464bad8..64abd37 100644
--- a/src/worker/fastcgi_handler.c
+++ b/src/worker/fastcgi_handler.c
@@ -162,6 +162,7 @@ static void fastcgi_error_cb(chunk_ctx_t *ctx) {
 
     logger_set_prefix("[%s%*s%s]%s", BLD_STR, ADDRSTRLEN, ctx->client->req_host, CLR_STR, ctx->client->log_prefix);
 
+    // FIXME segfault on error_cb
     warning("Closing connection due to FastCGI error");
     if(ctx->client->fcgi_ctx) {
         fastcgi_close(ctx->client->fcgi_ctx);