~james-page/ubuntu/oneiric/tomcat6/CVE-2011-3190

« back to all changes in this revision

Viewing changes to java/org/apache/catalina/servlets/DefaultServlet.java

  • Committer: Bazaar Package Importer
  • Author(s): tony mancill
  • Date: 2011-04-18 20:38:29 UTC
  • mfrom: (2.2.27 sid)
  • Revision ID: james.westby@ubuntu.com-20110418203829-ogfwstmnzl4o3nby
Tags: 6.0.32-3
* Team upload.
* Include upstream patch for ASF Bugzilla - Bug 50700
  (Context parameters are being overridden with parameters from the 
   web application deployment descriptor) (Closes: #623242)

Show diffs side-by-side

added added

removed removed

Lines of Context:
68
68
 
69
69
 
70
70
/**
71
 
 * The default resource-serving servlet for most web applications,
 
71
 * <p>The default resource-serving servlet for most web applications,
72
72
 * used to serve static resources such as HTML pages and images.
73
 
 *
 
73
 * </p>
 
74
 * <p>
 
75
 * This servlet is intended to be mapped to <em>/</em> e.g.:
 
76
 * </p>
 
77
 * <pre>
 
78
 *   &lt;servlet-mapping&gt;
 
79
 *       &lt;servlet-name&gt;default&lt;/servlet-name&gt;
 
80
 *       &lt;url-pattern&gt;/&lt;/url-pattern&gt;
 
81
 *   &lt;/servlet-mapping&gt;
 
82
 * </pre>
 
83
 * <p>It can be mapped to sub-paths, however in all cases resources are served
 
84
 * from the web appplication resource root using the full path from the root
 
85
 * of the web application context.
 
86
 * <br/>e.g. given a web application structure:
 
87
 *</p>
 
88
 * <pre>
 
89
 * /context
 
90
 *   /images
 
91
 *     tomcat2.jpg
 
92
 *   /static
 
93
 *     /images
 
94
 *       tomcat.jpg
 
95
 * </pre>
 
96
 * <p>
 
97
 * ... and a servlet mapping that maps only <code>/static/*</code> to the default servlet:
 
98
 * </p>
 
99
 * <pre>
 
100
 *   &lt;servlet-mapping&gt;
 
101
 *       &lt;servlet-name&gt;default&lt;/servlet-name&gt;
 
102
 *       &lt;url-pattern&gt;/static/*&lt;/url-pattern&gt;
 
103
 *   &lt;/servlet-mapping&gt;
 
104
 * </pre>
 
105
 * <p>
 
106
 * Then a request to <code>/context/static/images/tomcat.jpg</code> will succeed
 
107
 * while a request to <code>/context/images/tomcat2.jpg</code> will fail. 
 
108
 * </p>
74
109
 * @author Craig R. McClanahan
75
110
 * @author Remy Maucherat
76
 
 * @version $Id: DefaultServlet.java 939518 2010-04-30 00:08:58Z kkolinko $
 
111
 * @version $Id: DefaultServlet.java 1061395 2011-01-20 17:08:54Z markt $
77
112
 */
78
113
 
79
114
public class DefaultServlet
296
331
     * @param request The servlet request we are processing
297
332
     */
298
333
    protected String getRelativePath(HttpServletRequest request) {
 
334
        // IMPORTANT: DefaultServlet can be mapped to '/' or '/path/*' but always
 
335
        // serves resources from the web app root with context rooted paths.
 
336
        // i.e. it can not be used to mount the web app root under a sub-path
 
337
        // This method must construct a complete context rooted path, although
 
338
        // subclasses can change this behaviour.
299
339
 
300
340
        // Are we being processed by a RequestDispatcher.include()?
301
341
        if (request.getAttribute(Globals.INCLUDE_REQUEST_URI_ATTR) != null) {
302
342
            String result = (String) request.getAttribute(
303
343
                                            Globals.INCLUDE_PATH_INFO_ATTR);
304
 
            if (result == null)
 
344
            if (result == null) {
305
345
                result = (String) request.getAttribute(
306
346
                                            Globals.INCLUDE_SERVLET_PATH_ATTR);
307
 
            if ((result == null) || (result.equals("")))
 
347
            } else {
 
348
                result = (String) request.getAttribute(
 
349
                                  Globals.INCLUDE_SERVLET_PATH_ATTR) + result;
 
350
            }
 
351
            if ((result == null) || (result.equals(""))) {
308
352
                result = "/";
 
353
            }
309
354
            return (result);
310
355
        }
311
356
 
313
358
        String result = request.getPathInfo();
314
359
        if (result == null) {
315
360
            result = request.getServletPath();
 
361
        } else {
 
362
            result = request.getServletPath() + result;
316
363
        }
317
364
        if ((result == null) || (result.equals(""))) {
318
365
            result = "/";
323
370
 
324
371
 
325
372
    /**
 
373
     * Determines the appropriate path to prepend resources with
 
374
     * when generating directory listings. Depending on the behaviour of 
 
375
     * {@link #getRelativePath(HttpServletRequest)} this will change.
 
376
     * @param request the request to determine the path for
 
377
     * @return the prefix to apply to all resources in the listing.
 
378
     */
 
379
    protected String getPathPrefix(final HttpServletRequest request) {
 
380
        return request.getContextPath();
 
381
    }
 
382
 
 
383
 
 
384
    /**
326
385
     * Process a GET request for the specified resource.
327
386
     *
328
387
     * @param request The servlet request we are processing
720
779
            }
721
780
        }
722
781
 
 
782
        boolean isError = false;
 
783
        Integer status =
 
784
            (Integer) request.getAttribute("javax.servlet.error.status_code");
 
785
        if (status != null) {
 
786
            isError = status.intValue() >= HttpServletResponse.SC_BAD_REQUEST;
 
787
        }
 
788
 
723
789
        // Check if the conditions specified in the optional If headers are
724
790
        // satisfied.
725
791
        if (cacheEntry.context == null) {
727
793
            // Checking If headers
728
794
            boolean included =
729
795
                (request.getAttribute(Globals.INCLUDE_CONTEXT_PATH_ATTR) != null);
730
 
            if (!included
731
 
                && !checkIfHeaders(request, response, cacheEntry.attributes)) {
 
796
            if (!included && !isError &&
 
797
                    !checkIfHeaders(request, response, cacheEntry.attributes)) {
732
798
                return;
733
799
            }
734
800
 
756
822
            contentType = "text/html;charset=UTF-8";
757
823
 
758
824
        } else {
759
 
            if (useAcceptRanges) {
760
 
                // Accept ranges header
761
 
                response.setHeader("Accept-Ranges", "bytes");
 
825
            if (!isError) {
 
826
                if (useAcceptRanges) {
 
827
                    // Accept ranges header
 
828
                    response.setHeader("Accept-Ranges", "bytes");
 
829
                }
 
830
    
 
831
                // Parse range specifier
 
832
                ranges = parseRange(request, response, cacheEntry.attributes);
 
833
    
 
834
                // ETag header
 
835
                response.setHeader("ETag", cacheEntry.attributes.getETag());
 
836
    
 
837
                // Last-Modified header
 
838
                response.setHeader("Last-Modified",
 
839
                        cacheEntry.attributes.getLastModifiedHttp());
762
840
            }
763
841
 
764
 
            // Parse range specifier
765
 
            ranges = parseRange(request, response, cacheEntry.attributes);
766
 
 
767
 
            // ETag header
768
 
            response.setHeader("ETag", cacheEntry.attributes.getETag());
769
 
 
770
 
            // Last-Modified header
771
 
            response.setHeader("Last-Modified",
772
 
                    cacheEntry.attributes.getLastModifiedHttp());
773
 
 
774
842
            // Get content length
775
843
            contentLength = cacheEntry.attributes.getContentLength();
776
844
            // Special case for zero length files, which would cause a
804
872
 
805
873
        }
806
874
 
807
 
        if ( (cacheEntry.context != null) 
 
875
        if ( (cacheEntry.context != null)
 
876
                || isError
808
877
                || ( ((ranges == null) || (ranges.isEmpty()))
809
878
                        && (request.getHeader("Range") == null) )
810
879
                || (ranges == FULL) ) {
833
902
 
834
903
                if (content) {
835
904
                    // Serve the directory browser
836
 
                    renderResult =
837
 
                        render(request.getContextPath(), cacheEntry);
 
905
                    renderResult = render(getPathPrefix(request), cacheEntry);
838
906
                }
839
907
 
840
908
            }