diff options
author | Glenn Strauss <gstrauss@gluelogic.com> | 2016-03-04 18:54:24 +0000 |
---|---|---|
committer | Stefan Bühler <stbuehler@web.de> | 2016-03-04 18:54:24 +0000 |
commit | 94647804cfa89b8e4c5fcb986c7337fbe33d0a33 (patch) | |
tree | 4be6467235c7a61441be0ff060005385a006cd53 /src | |
parent | c80ae9b212806eea0adbc675c716ddc4f1b01777 (diff) | |
download | lighttpd-git-94647804cfa89b8e4c5fcb986c7337fbe33d0a33.tar.gz |
[mod_cgi] send 500 if CGI ends and there is no response (fixes #2542)
(Thx, anomie, who identified and explained problem in above ticket)
From: Glenn Strauss <gstrauss@gluelogic.com>
git-svn-id: svn://svn.lighttpd.net/lighttpd/branches/lighttpd-1.4.x@3089 152afb58-edef-0310-8abb-c4023f1b3aa9
Diffstat (limited to 'src')
-rw-r--r-- | src/mod_cgi.c | 52 |
1 files changed, 33 insertions, 19 deletions
diff --git a/src/mod_cgi.c b/src/mod_cgi.c index bfbfa13c..ae5cf9e9 100644 --- a/src/mod_cgi.c +++ b/src/mod_cgi.c @@ -584,38 +584,48 @@ static handler_t cgi_connection_close(server *srv, handler_ctx *hctx) { * -> we get here with waitpid == ECHILD * */ - if (errno == ECHILD) return HANDLER_GO_ON; - - log_error_write(srv, __FILE__, __LINE__, "ss", "waitpid failed: ", strerror(errno)); - return HANDLER_ERROR; - default: - /* Send an error if we haven't sent any data yet */ - if (0 == con->file_started) { - connection_set_state(srv, con, CON_STATE_HANDLE_REQUEST); - con->http_status = 500; - con->mode = DIRECT; - } else { - con->file_finished = 1; + if (errno != ECHILD) { + log_error_write(srv, __FILE__, __LINE__, "ss", "waitpid failed: ", strerror(errno)); } - + /* anyway: don't wait for it anymore */ + pid = 0; + break; + default: if (WIFEXITED(status)) { #if 0 log_error_write(srv, __FILE__, __LINE__, "sd", "(debug) cgi exited fine, pid:", pid); #endif - return HANDLER_GO_ON; } else { log_error_write(srv, __FILE__, __LINE__, "sd", "cgi died, pid:", pid); - return HANDLER_GO_ON; } - } + pid = 0; + break; + } - kill(pid, SIGTERM); + if (pid) { + kill(pid, SIGTERM); - /* cgi-script is still alive, queue the PID for removal */ - cgi_pid_add(srv, p, pid); + /* cgi-script is still alive, queue the PID for removal */ + cgi_pid_add(srv, p, pid); + } } #endif + + if (con->state == CON_STATE_HANDLE_REQUEST) { + /* (not CON_STATE_ERROR and not CON_STATE_RESPONSE_END, + * i.e. not called from cgi_connection_close_callback()) */ + + /* Send an error if we haven't sent any data yet */ + if (0 == con->file_started) { + con->http_status = 500; + con->mode = DIRECT; + } else if (0 == con->file_finished) { + http_chunk_close(srv, con); + con->file_finished = 1; + } + } + return HANDLER_GO_ON; } @@ -1423,6 +1433,10 @@ SUBREQUEST_FUNC(mod_cgi_handle_subrequest) { hctx->pid = 0; + if (cgi_demux_response(srv, hctx) == FDEVENT_HANDLED_ERROR) { + log_error_write(srv, __FILE__, __LINE__, "s", "demuxer failed: "); + } + /* we already have response headers? just continue */ if (con->file_started) return HANDLER_FINISHED; |