-/* $OpenBSD: httpd.h,v 1.163 2023/07/12 12:37:27 tb Exp $ */
+/* $OpenBSD: httpd.h,v 1.164 2023/11/08 19:19:10 millert Exp $ */
/*
* Copyright (c) 2006 - 2015 Reyk Floeter <reyk@openbsd.org>
int clt_done;
int clt_chunk;
int clt_inflight;
+ int clt_fcgi_count;
struct range_data clt_ranges;
struct fcgi_data clt_fcgi;
const char *clt_fcgi_error;
-/* $OpenBSD: server.c,v 1.128 2023/09/03 10:18:18 nicm Exp $ */
+/* $OpenBSD: server.c,v 1.129 2023/11/08 19:19:10 millert Exp $ */
/*
* Copyright (c) 2006 - 2015 Reyk Floeter <reyk@openbsd.org>
{
struct server *srv = clt->clt_srv;
- if (clt->clt_fcgi_error != NULL) {
+ if (clt->clt_fcgi_count-- > 0) {
clt->clt_fcgi_error = msg;
return;
}
-/* $OpenBSD: server_fcgi.c,v 1.96 2023/07/12 12:37:28 tb Exp $ */
+/* $OpenBSD: server_fcgi.c,v 1.97 2023/11/08 19:19:10 millert Exp $ */
/*
* Copyright (c) 2014 Florian Obser <florian@openbsd.org>
if (clt->clt_toread != 0) {
/*
* XXX - Work around UAF: server_read_httpcontent() can call
- * server_close(), normally freeing clt. If clt->clt_fcgi_error
- * changed, call server_close() via server_abort_http().
+ * server_close(), normally freeing clt. If clt->clt_fcgi_count
+ * reaches 0, call server_close() via server_abort_http().
*/
- clt->clt_fcgi_error = "";
+ clt->clt_fcgi_count++;
server_read_httpcontent(clt->clt_bev, clt);
- errstr = clt->clt_fcgi_error;
- clt->clt_fcgi_error = NULL;
- if (errstr[0] != '\0')
+ if (clt->clt_fcgi_count-- <= 0) {
+ errstr = clt->clt_fcgi_error;
goto fail;
- errstr = NULL;
+ }
bufferevent_enable(clt->clt_bev, EV_READ);
} else {
bufferevent_disable(clt->clt_bev, EV_READ);