diff --git a/src/mod_cgi.c b/src/mod_cgi.c index 60b2a83a..6aedaa6e 100644 --- a/src/mod_cgi.c +++ b/src/mod_cgi.c @@ -474,30 +474,25 @@ static handler_t cgi_connection_close(server *srv, handler_ctx *hctx) { #ifndef __WIN32 -#if 0 - log_error_write(srv, __FILE__, __LINE__, "sdd", - "emergency exit: cgi", - con->fd, - hctx->fd); -#endif - /* the connection to the browser went away, but we still have a connection * to the CGI script * * close cgi-connection */ - /* close connection to the cgi-script */ - fdevent_event_del(srv->ev, &(hctx->fde_ndx), hctx->fd); - fdevent_unregister(srv->ev, hctx->fd); - - if (close(hctx->fd)) { - log_error_write(srv, __FILE__, __LINE__, "sds", "cgi close failed ", hctx->fd, strerror(errno)); + if (hctx->fd != -1) { + /* close connection to the cgi-script */ + fdevent_event_del(srv->ev, &(hctx->fde_ndx), hctx->fd); + fdevent_unregister(srv->ev, hctx->fd); + + if (close(hctx->fd)) { + log_error_write(srv, __FILE__, __LINE__, "sds", "cgi close failed ", hctx->fd, strerror(errno)); + } + + hctx->fd = -1; + hctx->fde_ndx = -1; } - hctx->fd = -1; - hctx->fde_ndx = -1; - pid = hctx->pid; con->plugin_ctx[p->id] = NULL; @@ -597,7 +592,8 @@ static handler_t cgi_handle_fdevent(void *s, void *ctx, int revents) { #endif cgi_connection_close(srv, hctx); - break; + /* if we get a IN|HUP and have read everything don't exec the close twice */ + return HANDLER_FINISHED; case FDEVENT_HANDLED_ERROR: connection_set_state(srv, con, CON_STATE_HANDLE_REQUEST); con->http_status = 500;