From cc68ed48698d37ae4332b92927f81f7d268e7f6b Mon Sep 17 00:00:00 2001 From: Joe Orton Date: Thu, 27 Aug 2020 14:00:51 +0100 Subject: [PATCH] merge fixes from RHEL (r1848298, etc) --- mod_fcgid-2.3.9-r1848298.patch | 87 +++++++++++++++++++++++++++ mod_fcgid-2.3.9-segfault-upload.patch | 49 +++++++++++++++ mod_fcgid.spec | 10 ++- 3 files changed, 145 insertions(+), 1 deletion(-) create mode 100644 mod_fcgid-2.3.9-r1848298.patch create mode 100644 mod_fcgid-2.3.9-segfault-upload.patch diff --git a/mod_fcgid-2.3.9-r1848298.patch b/mod_fcgid-2.3.9-r1848298.patch new file mode 100644 index 0000000..3f5dd93 --- /dev/null +++ b/mod_fcgid-2.3.9-r1848298.patch @@ -0,0 +1,87 @@ +# ./pullrev.sh 1848298 + +http://svn.apache.org/viewvc?view=revision&revision=1848298 + +https://bugzilla.redhat.com/show_bug.cgi?id=1652493 + +--- mod_fcgid-2.3.9/modules/fcgid/fcgid_bridge.c ++++ mod_fcgid-2.3.9/modules/fcgid/fcgid_bridge.c +@@ -526,7 +526,8 @@ + } + + static int add_request_body(request_rec *r, apr_pool_t *request_pool, +- apr_bucket_brigade *output_brigade) ++ apr_bucket_brigade *output_brigade, ++ apr_off_t *body_length) + { + apr_bucket *bucket_input, *bucket_header; + apr_file_t *fd = NULL; +@@ -729,22 +730,49 @@ + } + APR_BRIGADE_INSERT_TAIL(output_brigade, bucket_header); + ++ *body_length = request_size; ++ + return 0; + } + + int bridge_request(request_rec * r, int role, fcgid_cmd_conf *cmd_conf) + { +- apr_bucket_brigade *output_brigade; ++ apr_bucket_brigade *output_brigade, *body_brigade; + apr_bucket *bucket_eos; +- char **envp = ap_create_environment(r->pool, +- r->subprocess_env); ++ char **envp; + int rc; + + /* Create brigade for the request to fastcgi server */ ++ body_brigade ++ = apr_brigade_create(r->pool, r->connection->bucket_alloc); + output_brigade = + apr_brigade_create(r->pool, r->connection->bucket_alloc); + +- /* Build the begin request and environ request, append them to output_brigade */ ++ /* In responder mode, handle the request body up front to ensure ++ * the content-length is known (even if the request body is ++ * chunked) and sent in the header. */ ++ if (role == FCGI_RESPONDER) { ++ apr_off_t body_length; ++ ++ rc = add_request_body(r, r->pool, body_brigade, &body_length); ++ if (rc) { ++ return rc; ++ } ++ ++ if (body_length && !apr_table_get(r->headers_in, "Content-Length")) { ++ ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, ++ "mod_fcgid: dechunked request body length %" APR_OFF_T_FMT, ++ body_length); ++ ++ apr_table_set(r->subprocess_env, "CONTENT_LENGTH", ++ apr_off_t_toa(r->pool, body_length)); ++ apr_table_unset(r->subprocess_env, "HTTP_TRANSFER_ENCODING"); ++ } ++ } ++ ++ envp = ap_create_environment(r->pool, r->subprocess_env); ++ ++ /* Build the begin request and environ request, add them to output_brigade */ + if (!build_begin_block + (role, r, r->connection->bucket_alloc, output_brigade) + || !build_env_block(r, envp, r->connection->bucket_alloc, +@@ -754,12 +782,8 @@ + return HTTP_INTERNAL_SERVER_ERROR; + } + +- if (role == FCGI_RESPONDER) { +- rc = add_request_body(r, r->pool, output_brigade); +- if (rc) { +- return rc; +- } +- } ++ /* Append the body output. */ ++ APR_BRIGADE_CONCAT(output_brigade, body_brigade); + + /* The eos bucket now */ + bucket_eos = apr_bucket_eos_create(r->connection->bucket_alloc); diff --git a/mod_fcgid-2.3.9-segfault-upload.patch b/mod_fcgid-2.3.9-segfault-upload.patch new file mode 100644 index 0000000..099be55 --- /dev/null +++ b/mod_fcgid-2.3.9-segfault-upload.patch @@ -0,0 +1,49 @@ +diff --git a/modules/fcgid/fcgid_proc_unix.c b/modules/fcgid/fcgid_proc_unix.c +index 218f3f7..8b69a89 100644 +--- a/modules/fcgid/fcgid_proc_unix.c ++++ b/modules/fcgid/fcgid_proc_unix.c +@@ -762,14 +762,15 @@ apr_status_t proc_write_ipc(fcgid_ipc *ipc_handle, + struct iovec vec[FCGID_VEC_COUNT]; + int nvec = 0; + apr_bucket *e; ++ apr_bucket_brigade* tmpbb = apr_brigade_create(output_brigade->p,output_brigade->bucket_alloc); + +- for (e = APR_BRIGADE_FIRST(output_brigade); +- e != APR_BRIGADE_SENTINEL(output_brigade); +- e = APR_BUCKET_NEXT(e)) { ++ while (!APR_BRIGADE_EMPTY(output_brigade)) { ++ e = APR_BRIGADE_FIRST(output_brigade); + apr_size_t len; + const char* base; + + if (APR_BUCKET_IS_METADATA(e)) { ++ apr_bucket_delete(e); + continue; + } + +@@ -780,6 +781,9 @@ apr_status_t proc_write_ipc(fcgid_ipc *ipc_handle, + return rv; + } + ++ APR_BUCKET_REMOVE(e); ++ APR_BRIGADE_INSERT_TAIL(tmpbb, e); ++ + vec[nvec].iov_len = len; + vec[nvec].iov_base = (char*) base; + if (nvec == (FCGID_VEC_COUNT - 1)) { +@@ -789,6 +793,7 @@ apr_status_t proc_write_ipc(fcgid_ipc *ipc_handle, + FCGID_VEC_COUNT)) != APR_SUCCESS) + return rv; + nvec = 0; ++ apr_brigade_cleanup(tmpbb); + } + else + nvec++; +@@ -800,6 +805,7 @@ apr_status_t proc_write_ipc(fcgid_ipc *ipc_handle, + return rv; + } + ++ apr_brigade_destroy(tmpbb); + return APR_SUCCESS; + } + diff --git a/mod_fcgid.spec b/mod_fcgid.spec index f3d702a..dc62620 100644 --- a/mod_fcgid.spec +++ b/mod_fcgid.spec @@ -35,7 +35,7 @@ Name: mod_fcgid Version: 2.3.9 -Release: 21%{?dist} +Release: 22%{?dist} Summary: FastCGI interface module for Apache 2 License: ASL 2.0 URL: http://httpd.apache.org/mod_fcgid/ @@ -46,6 +46,8 @@ Source3: mod_fcgid-2.1-README.SELinux Source4: mod_fcgid-tmpfs.conf Source5: fcgid24.conf Patch0: mod_fcgid-2.3.4-fixconf-shellbang.patch +Patch1: mod_fcgid-2.3.9-segfault-upload.patch +Patch2: mod_fcgid-2.3.9-r1848298.patch BuildRequires: coreutils BuildRequires: gcc BuildRequires: httpd-devel >= 2.0 @@ -76,6 +78,9 @@ cp -p %{SOURCE5} fcgid24.conf %patch0 -p1 %endif +%patch1 -p1 -b .segfault_upload +%patch2 -p1 -b .r1848298 + %build APXS=%{_httpd_apxs} ./configure.apxs make @@ -127,6 +132,9 @@ install -p -m 644 %{SOURCE4} %{buildroot}%{_tmpfilesdir}/mod_fcgid.conf %dir %attr(0775,root,apache) %{rundir}/mod_fcgid/ %changelog +* Thu Aug 27 2020 Joe Orton - 2.3.9-22 +- merge fixes from RHEL (r1848298, etc) + * Tue Jul 28 2020 Fedora Release Engineering - 2.3.9-21 - Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild