Bug 1785100

Summary: mod_cgid takes CGIDScriptTimeout x 2 seconds for timeout [rhel-7.9.z]
Product: Red Hat Enterprise Linux 7 Reporter: Hisanobu Okuda <hokuda>
Component: httpdAssignee: Luboš Uhliarik <luhliari>
Status: CLOSED ERRATA QA Contact: icesalov
Severity: unspecified Docs Contact:
Priority: unspecified    
Version: 7.8CC: bnater, jorton, jreznik, luhliari, pamadio
Target Milestone: rcKeywords: ZStream
Target Release: ---   
Hardware: Unspecified   
OS: Unspecified   
Whiteboard:
Fixed In Version: Doc Type: If docs needed, set a value
Doc Text:
Story Points: ---
Clone Of:
: 1875844 1977234 (view as bug list) Environment:
Last Closed: 2020-11-10 13:10:55 UTC Type: Bug
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:
Bug Depends On:    
Bug Blocks: 1875844, 1977234    

Description Hisanobu Okuda 2019-12-19 06:44:20 UTC
Description of problem:

When a cgi script takes so long time to provide a response, mod_cgid takes CGIDScriptTimeout x 2 seconds for timeout.

Version-Release number of selected component (if applicable):

    httpd-2.4.6-90.el7.x86_64

How reproducible:


Steps to Reproduce:
1. yum -y install httpd-2.4.6-90.el7.x86_64
 
2. Edit /etc/httpd/conf.modules.d/00-mpm.conf to enable the event mpm module only.
 
3. Edit /etc/httpd/conf/httpd.conf and add:

------------------------------------ 
CGIDScriptTimeout 10
KeepAlive On 
KeepAliveTimeout 2

ExtendedStatus on
<Location /server-status>
SetHandler server-status
</Location>
------------------------------------ 
 
 
4. systemctl start httpd

5. Create a cgi script and chmod+x it in /var/www/cgi-bin/test.py and chmod +x it.

------------------------------------ 
#!/usr/bin/python                                                                                                   
import os
import time
import sys
print "Content-Type: text/html"     # HTML is following                                                              
print                               # blank line, end of headers                                                     
time.sleep(31)
sys.stdout.flush()
time.sleep(65)
------------------------------------ 

6. Fetch the page with curl:

time curl -kv  http://127.0.0.1/cgi-bin/test.py

7. After 10 seconds (CGIDScriptTimeout), an error occurs in /var/log/apache/error_log

[Tue Dec 17 10:02:58.730053 2019] [cgid:error] [pid 24364:tid 140669817440000] [client 127.0.0.1:48540] Script timed out before returning headers: test.py

8. After another 10 seconds, "504 Gateway Timeout" is returned


Actual results:


Expected results:


Additional info:

Comment 2 Hisanobu Okuda 2019-12-19 06:47:18 UTC
After the message "Script timed out before returning headers: test.py" appears, discard_script_output() is called in log_script() to "Soak up script output" and takes `CGIDScriptTimeout` seconds to be timed out.
I think it is not needed:

----------------------------------------------------------
1101 static int log_script(request_rec *r, cgid_server_conf * conf, int ret,
1102                       char *dbuf, const char *sbuf, apr_bucket_brigade *bb,
1103                       apr_file_t *script_err)
1104 {
1105     const apr_array_header_t *hdrs_arr = apr_table_elts(r->headers_in);
1106     const apr_table_entry_t *hdrs = (apr_table_entry_t *) hdrs_arr->elts;
1107     char argsbuffer[HUGE_STRING_LEN];
1108     apr_file_t *f = NULL;
1109     apr_bucket *e;
1110     const char *buf;
1111     apr_size_t len;
1112     apr_status_t rv;
1113     int first;
1114     int i;
1115     struct stat finfo;
1116     char time_str[APR_CTIME_LEN];
1117 
1118     /* XXX Very expensive mainline case! Open, then getfileinfo! */
1119     if (!conf->logname ||
1120         ((stat(conf->logname, &finfo) == 0)
1121          && (finfo.st_size > conf->logbytes)) ||
1122          (apr_file_open(&f, conf->logname,
1123                   APR_APPEND|APR_WRITE|APR_CREATE, APR_OS_DEFAULT, r->pool) != APR_SUCCESS)) {
1124         /* Soak up script output */
1125         discard_script_output(bb);  <<<<==== Is it needed actually?
1126         if (script_err) {

----------------------------------------------------------

Comment 22 errata-xmlrpc 2020-11-10 13:10:55 UTC
Since the problem described in this bug report should be
resolved in a recent advisory, it has been closed with a
resolution of ERRATA.

For information on the advisory (httpd bug fix and enhancement update), and where to find the updated
files, follow the link below.

If the solution does not work for you, open a new bug report.

https://access.redhat.com/errata/RHBA-2020:5033