From 0f526d7b958491e817e51a169c84f99072233237 Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Thu, 13 Jul 2023 23:09:49 +0200 Subject: [PATCH] Fix FastCGI error handling --- src/lib/fastcgi.c | 2 ++ src/worker/fastcgi_frame_handler.c | 10 +++++++--- src/worker/fastcgi_handler.c | 2 +- src/worker/func.h | 4 +++- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/lib/fastcgi.c b/src/lib/fastcgi.c index 0a5e618..7bd374c 100644 --- a/src/lib/fastcgi.c +++ b/src/lib/fastcgi.c @@ -213,6 +213,8 @@ int fastcgi_close_cnx(fastcgi_cnx_t *cnx) { sock_close(&cnx->out); if (cnx->fd_err != -1) close(cnx->fd_err); if (cnx->fd_out != -1) close(cnx->fd_out); + cnx->fd_err = -1; + cnx->fd_out = -1; errno = e; return 0; diff --git a/src/worker/fastcgi_frame_handler.c b/src/worker/fastcgi_frame_handler.c index e02bb04..298fd42 100644 --- a/src/worker/fastcgi_frame_handler.c +++ b/src/worker/fastcgi_frame_handler.c @@ -51,10 +51,9 @@ int fastcgi_handle_connection(client_ctx_t *ctx, fastcgi_cnx_t **cnx) { } void fastcgi_close(fastcgi_ctx_t *ctx) { - if (ctx->closed == 0) { - ctx->closed++; + ctx->closed++; + if (ctx->closed != 2) return; - } logger_set_prefix("[%*s]%s", ADDRSTRLEN, ctx->client->socket.s_addr, ctx->client->log_prefix); @@ -70,3 +69,8 @@ void fastcgi_close(fastcgi_ctx_t *ctx) { free(ctx); errno = 0; } + +void fastcgi_close_error(fastcgi_ctx_t *ctx) { + logger_set_prefix("[%*s]%s", ADDRSTRLEN, ctx->client->socket.s_addr, ctx->client->log_prefix); + fastcgi_close_cnx(&ctx->cnx); +} diff --git a/src/worker/fastcgi_handler.c b/src/worker/fastcgi_handler.c index 5b1fa15..06b7555 100644 --- a/src/worker/fastcgi_handler.c +++ b/src/worker/fastcgi_handler.c @@ -165,7 +165,7 @@ static void fastcgi_error_cb(chunk_ctx_t *ctx) { // FIXME segfault on error_cb warning("Closing connection due to FastCGI error"); if(ctx->client->fcgi_ctx) { - fastcgi_close(ctx->client->fcgi_ctx); + fastcgi_close_error(ctx->client->fcgi_ctx); ctx->client->fcgi_ctx = NULL; } diff --git a/src/worker/func.h b/src/worker/func.h index 68049b2..f8ef533 100644 --- a/src/worker/func.h +++ b/src/worker/func.h @@ -46,7 +46,7 @@ typedef struct { } ws_ctx_t; typedef struct { - int closed:2; + unsigned char closed:4; client_ctx_t *client; fastcgi_cnx_t cnx; } fastcgi_ctx_t; @@ -95,4 +95,6 @@ int fastcgi_handle_connection(client_ctx_t *ctx, fastcgi_cnx_t **cnx); void fastcgi_close(fastcgi_ctx_t *ctx); +void fastcgi_close_error(fastcgi_ctx_t *ctx); + #endif //SESIMOS_FUNC_H