DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG 
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://nagoya.apache.org/bugzilla/show_bug.cgi?id=8831>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND 
INSERTED IN THE BUG DATABASE.

http://nagoya.apache.org/bugzilla/show_bug.cgi?id=8831

ErrorReportValve.java corrupts data in subtle way

           Summary: ErrorReportValve.java corrupts data in subtle way
           Product: Tomcat 4
           Version: 4.0.1 Final
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: Normal
          Priority: Other
         Component: Catalina
        AssignedTo: [EMAIL PROTECTED]
        ReportedBy: [EMAIL PROTECTED]


We have run into a few problems in ErrorValve.java which are causing very subtle
data corruption in client applications.

1.  First the minor problem:  ErrorReportValve.report() has some inconsistent
short-circuit logic.  It will do nothing if:
    - response is already committed
    - response code is 1xx Continue
    - one of two specific 2xx response codes: 200, 204
    - content not modified response code 304

If the response code is 2xx, then it is not an error, and ErrorReportValve
should return.  Why only 200 and 204?  [In our case, we are doing WebDav, and a
successful return code is 207 Multi-status.  ErrorReportValve incorrectly
interprets this as an error, which leads to the next problem...]

2.  ErrorReportValve modifies headers, tries to write its own HTML error and
fails, leaves modified headers with original body content.

This one is really bad.  If ErrorReportValve thinks there is an error, it does
the following:
   - modifies the Content-type of the response to text/html  
   - generates a big HTML message in a StringBuffer
   - then it tries to grab a Writer

If the application has already obtained an OutputStream, then ErrorReportValve's
attempt will fail with an exception, which is what happened in our case.  To
compound the problem, nothing is logged in the catch block of the exception!  

In our case, this causes our text/xml body to have a Content-type header of
text/html, which causes all kinds of trouble - and there is no indication in any
logs that there was a problem.

Proposed solution:
------------------
It would be safest for ErrorReportValve to either grab the Writer first, before
any changes are made to the HttpServletResponse.  If that fails, then you could
catch the IllegalStateException, and grab an OutputStream and wrap your own
Writer around it.

*Only after it has a known good Writer* should ErrorReportValve change the
content-type of the response.  That way, there is something visible to the
application that is more clear that Catalina considers something to be wrong and
the corruption to the response that ErrorReportValve has introduced is
intentional, obvious, and thus rapidly fixable, rather than subtle and nearly
undetectable.

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to