diff options
Diffstat (limited to 'httpd/server_fcgi.c')
-rw-r--r-- | httpd/server_fcgi.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/httpd/server_fcgi.c b/httpd/server_fcgi.c index e7d9747..21ebeed 100644 --- a/httpd/server_fcgi.c +++ b/httpd/server_fcgi.c @@ -1,4 +1,4 @@ -/* $OpenBSD: server_fcgi.c,v 1.64 2015/08/20 13:00:23 reyk Exp $ */ +/* $OpenBSD: server_fcgi.c,v 1.68 2016/04/24 20:09:45 chrisz Exp $ */ /* * Copyright (c) 2014 Florian Obser <florian@openbsd.org> @@ -122,7 +122,8 @@ server_fcgi(struct httpd *env, struct client *clt) struct sockaddr_un sun; size_t len; - if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) + if ((fd = socket(AF_UNIX, + SOCK_STREAM | SOCK_NONBLOCK, 0)) == -1) goto fail; memset(&sun, 0, sizeof(sun)); @@ -130,7 +131,7 @@ server_fcgi(struct httpd *env, struct client *clt) len = strlcpy(sun.sun_path, srv_conf->socket, sizeof(sun.sun_path)); if (len >= sizeof(sun.sun_path)) { - errstr = "socket path to long"; + errstr = "socket path too long"; goto fail; } sun.sun_len = len; @@ -139,8 +140,6 @@ server_fcgi(struct httpd *env, struct client *clt) goto fail; } - socket_set_blockmode(fd, BM_NONBLOCK); - memset(hbuf, 0, sizeof(hbuf)); clt->clt_fcgi_state = FCGI_READ_HEADER; clt->clt_fcgi_toread = sizeof(struct fcgi_record_header); @@ -243,12 +242,16 @@ server_fcgi(struct httpd *env, struct client *clt) goto fail; } - if (desc->http_query) + if (desc->http_query) { if (fcgi_add_param(¶m, "QUERY_STRING", desc->http_query, clt) == -1) { errstr = "failed to encode param"; goto fail; } + } else if (fcgi_add_param(¶m, "QUERY_STRING", "", clt) == -1) { + errstr = "failed to encode param"; + goto fail; + } if (fcgi_add_param(¶m, "DOCUMENT_ROOT", srv_conf->root, clt) == -1) { @@ -399,6 +402,8 @@ server_fcgi(struct httpd *env, struct client *clt) free(script); if (errstr == NULL) errstr = strerror(errno); + if (fd != -1 && clt->clt_fd != fd) + close(fd); server_abort_http(clt, 500, errstr); return (-1); } |