Author: markt
Date: Wed Dec 30 10:45:34 2009
New Revision: 894580
URL: http://svn.apache.org/viewvc?rev=894580&view=rev
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=48454
Give the stderr reader a chance to finish before terminating the CGI process.
This avoids "Bad file descriptor" errors. The period to wait is configurable.
Based on a patch by Markus Grieder
Modified:
tomcat/trunk/conf/web.xml
tomcat/trunk/java/org/apache/catalina/servlets/CGIServlet.java
tomcat/trunk/webapps/docs/cgi-howto.xml
Modified: tomcat/trunk/conf/web.xml
URL:
http://svn.apache.org/viewvc/tomcat/trunk/conf/web.xml?rev=894580&r1=894579&r2=894580&view=diff
==============================================================================
--- tomcat/trunk/conf/web.xml (original)
+++ tomcat/trunk/conf/web.xml Wed Dec 30 10:45:34 2009
@@ -301,6 +301,10 @@
<!-- -->
<!-- passShellEnvironment Should the shell environment variables (if -->
<!-- any) be passed to the CGI script? [false] -->
+ <!-- -->
+ <!-- stderrTimeout The time (in milliseconds) to wait for the -->
+ <!-- reading of stdErr to complete before -->
+ <!-- terminating the CGI process. [2000] -->
<!--
<servlet>
Modified: tomcat/trunk/java/org/apache/catalina/servlets/CGIServlet.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/servlets/CGIServlet.java?rev=894580&r1=894579&r2=894580&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/servlets/CGIServlet.java (original)
+++ tomcat/trunk/java/org/apache/catalina/servlets/CGIServlet.java Wed Dec 30
10:45:34 2009
@@ -261,8 +261,14 @@
private String cgiExecutable = "perl";
/** the encoding to use for parameters */
- private String parameterEncoding = System.getProperty("file.encoding",
- "UTF-8");
+ private String parameterEncoding =
+ System.getProperty("file.encoding", "UTF-8");
+
+ /**
+ * The time (in milliseconds) to wait for the reading of stdErr to complete
+ * before terminating the CGI process.
+ */
+ private long stderrTimeout = 2000;
/** object used to ensure multiple threads don't try to expand same file */
static Object expandFileLock = new Object();
@@ -309,6 +315,11 @@
parameterEncoding =
getServletConfig().getInitParameter("parameterEncoding");
}
+ if (getServletConfig().getInitParameter("stderrTimeout") != null) {
+ stderrTimeout = Long.parseLong(getServletConfig().getInitParameter(
+ "stderrTimeout"));
+ }
+
}
@@ -1588,6 +1599,7 @@
BufferedReader cgiHeaderReader = null;
InputStream cgiOutput = null;
BufferedReader commandsStdErr = null;
+ Thread errReaderThread = null;
BufferedOutputStream commandsStdIn = null;
Process proc = null;
int bufRead = -1;
@@ -1645,12 +1657,13 @@
(new InputStreamReader(proc.getErrorStream()));
final BufferedReader stdErrRdr = commandsStdErr ;
- new Thread() {
+ errReaderThread = new Thread() {
@Override
public void run () {
sendToLog(stdErrRdr) ;
}
- }.start() ;
+ };
+ errReaderThread.start();
InputStream cgiHeaderStream =
new HTTPHeaderInputStream(proc.getInputStream());
@@ -1743,6 +1756,14 @@
log ("Exception closing output stream " + ioe);
}
}
+ // Make sure the error stream reader has finished
+ if (errReaderThread != null) {
+ try {
+ errReaderThread.join(stderrTimeout);
+ } catch (InterruptedException e) {
+ log ("Interupted waiting for stderr reader thread");
+ }
+ }
if (debug > 4) {
log ("Running finally block");
}
Modified: tomcat/trunk/webapps/docs/cgi-howto.xml
URL:
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/cgi-howto.xml?rev=894580&r1=894579&r2=894580&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/cgi-howto.xml (original)
+++ tomcat/trunk/webapps/docs/cgi-howto.xml Wed Dec 30 10:45:34 2009
@@ -83,6 +83,9 @@
<li><strong>passShellEnvironment</strong> - Should the shell environment
variables (if any) be passed to the CGI script? Default is
<code>false</code>.</li>
+<li><strong>stderrTimeout</strong> - The time (in milliseconds) to wait for
+the reading of stderr to complete before terminating the CGI process? Default
+is 2000.</li>
</ul>
</p>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]