summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGlenn Strauss <gstrauss@gluelogic.com>2016-03-04 18:54:24 +0000
committerStefan Bühler <stbuehler@web.de>2016-03-04 18:54:24 +0000
commit94647804cfa89b8e4c5fcb986c7337fbe33d0a33 (patch)
tree4be6467235c7a61441be0ff060005385a006cd53 /src
parentc80ae9b212806eea0adbc675c716ddc4f1b01777 (diff)
downloadlighttpd-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.c52
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;