You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2014/03/13 11:42:49 UTC

svn commit: r1577103 - in /tomcat/trunk: java/org/apache/catalina/webresources/ test/org/apache/catalina/webresources/ webapps/docs/

Author: markt
Date: Thu Mar 13 10:42:49 2014
New Revision: 1577103

URL: http://svn.apache.org/r1577103
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=56253
When listing resources that are provided by a JAR, fix possible StringIndexOutOfBoundsExceptions. Add some unit tests for this and similar scenarios and fix the additional issues those unit tests identified. Based on a patch by Larry Isaacs. 

Modified:
    tomcat/trunk/java/org/apache/catalina/webresources/AbstractArchiveResourceSet.java
    tomcat/trunk/java/org/apache/catalina/webresources/JarResourceRoot.java
    tomcat/trunk/java/org/apache/catalina/webresources/LocalStrings.properties
    tomcat/trunk/test/org/apache/catalina/webresources/AbstractTestResourceSet.java
    tomcat/trunk/webapps/docs/changelog.xml

Modified: tomcat/trunk/java/org/apache/catalina/webresources/AbstractArchiveResourceSet.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/webresources/AbstractArchiveResourceSet.java?rev=1577103&r1=1577102&r2=1577103&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/webresources/AbstractArchiveResourceSet.java (original)
+++ tomcat/trunk/java/org/apache/catalina/webresources/AbstractArchiveResourceSet.java Thu Mar 13 10:42:49 2014
@@ -75,7 +75,7 @@ public abstract class AbstractArchiveRes
             String pathInJar =
                     getInternalPath() + path.substring(webAppMount.length());
             // Always strip off the leading '/' to get the JAR path
-            if (pathInJar.charAt(0) == '/') {
+            if (pathInJar.length() > 0 && pathInJar.charAt(0) == '/') {
                 pathInJar = pathInJar.substring(1);
             }
             Iterator<String> entries = jarFileEntries.keySet().iterator();
@@ -128,11 +128,13 @@ public abstract class AbstractArchiveRes
                     getInternalPath() + path.substring(webAppMount.length());
             // Always strip off the leading '/' to get the JAR path and make
             // sure it ends in '/'
-            if (pathInJar.charAt(pathInJar.length() - 1) != '/') {
-                pathInJar = pathInJar.substring(1) + '/';
-            }
-            if (pathInJar.charAt(0) == '/') {
-                pathInJar = pathInJar.substring(1);
+            if (pathInJar.length() > 0) {
+                if (pathInJar.charAt(pathInJar.length() - 1) != '/') {
+                    pathInJar = pathInJar.substring(1) + '/';
+                }
+                if (pathInJar.charAt(0) == '/') {
+                    pathInJar = pathInJar.substring(1);
+                }
             }
 
             Iterator<String> entries = jarFileEntries.keySet().iterator();
@@ -218,6 +220,10 @@ public abstract class AbstractArchiveRes
             }
             if (pathInJar.equals("")) {
                 // Special case
+                // This is a directory resource so the path must end with /
+                if (!path.endsWith("/")) {
+                    path = path + "/";
+                }
                 return new JarResourceRoot(root, new File(getBase()),
                         baseUrlString, path);
             } else {

Modified: tomcat/trunk/java/org/apache/catalina/webresources/JarResourceRoot.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/webresources/JarResourceRoot.java?rev=1577103&r1=1577102&r2=1577103&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/webresources/JarResourceRoot.java (original)
+++ tomcat/trunk/java/org/apache/catalina/webresources/JarResourceRoot.java Thu Mar 13 10:42:49 2014
@@ -38,16 +38,16 @@ public class JarResourceRoot extends Abs
     public JarResourceRoot(WebResourceRoot root, File base, String baseUrl,
             String webAppPath) {
         super(root, webAppPath);
+        // Validate the webAppPath before going any further
+        if (!webAppPath.endsWith("/")) {
+            throw new IllegalArgumentException(sm.getString(
+                    "jarResourceRoot.invalidWebAppPath", webAppPath));
+        }
         this.base = base;
         this.baseUrl = "jar:" + baseUrl;
         // Extract the name from the webAppPath
-        // Strip any trailing '/' character
-        String resourceName;
-        if (webAppPath.endsWith("/")) {
-            resourceName = webAppPath.substring(0, webAppPath.length() - 1);
-        } else {
-            resourceName = webAppPath;
-        }
+        // Strip the trailing '/' character
+        String resourceName = webAppPath.substring(0, webAppPath.length() - 1);
         int i = resourceName.lastIndexOf('/');
         if (i > -1) {
             resourceName = resourceName.substring(i + 1);

Modified: tomcat/trunk/java/org/apache/catalina/webresources/LocalStrings.properties
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/webresources/LocalStrings.properties?rev=1577103&r1=1577102&r2=1577103&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/webresources/LocalStrings.properties (original)
+++ tomcat/trunk/java/org/apache/catalina/webresources/LocalStrings.properties Thu Mar 13 10:42:49 2014
@@ -35,6 +35,8 @@ fileResource.getUrlFail=Unable to determ
 jarResource.getInputStreamFail=Unable to obtain an InputStream for the resource [{0}] located in the JAR [{1}]
 jarResource.getUrlFail=Unable to determine a URL for the resource [{0}] located in the JAR [{1}]
 
+jarResourceRoot.invalidWebAppPath=This resource always refers to a directory so the supplied webAppPath must end with / but the provided webAppPath was [{0}]
+
 standardRoot.checkStateNotStarted=The resources may not be accessed if they are not currently started
 standardRoot.createInvalidFile=Unable to create WebResourceSet from [{0}]
 standardRoot.createNoFileResourceSet=The FileResourceSet feature has not yet been implemented

Modified: tomcat/trunk/test/org/apache/catalina/webresources/AbstractTestResourceSet.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/webresources/AbstractTestResourceSet.java?rev=1577103&r1=1577102&r2=1577103&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/webresources/AbstractTestResourceSet.java (original)
+++ tomcat/trunk/test/org/apache/catalina/webresources/AbstractTestResourceSet.java Thu Mar 13 10:42:49 2014
@@ -66,7 +66,24 @@ public abstract class AbstractTestResour
 
     @Test
     public final void testGetResourceRoot() {
-        WebResource webResource = resourceRoot.getResource(getMount() + "/");
+        doTestGetResourceRoot(true);
+    }
+
+    @Test
+    public final void testGetResourceRootNoSlash() {
+        doTestGetResourceRoot(false);
+    }
+
+
+    private void doTestGetResourceRoot(boolean slash) {
+        String mount = getMount();
+        if (!slash && mount.length() == 0) {
+            return;
+        }
+        mount = mount + (slash ? "/" : "");
+
+        WebResource webResource = resourceRoot.getResource(mount);
+
         Assert.assertTrue(webResource.isDirectory());
         String expected;
         if (getMount().length() > 0) {
@@ -75,7 +92,7 @@ public abstract class AbstractTestResour
             expected = "";
         }
         Assert.assertEquals(expected, webResource.getName());
-        Assert.assertEquals(getMount() + "/", webResource.getWebappPath());
+        Assert.assertEquals(mount + (!slash ? "/" : ""), webResource.getWebappPath());
     }
 
     @Test
@@ -135,7 +152,22 @@ public abstract class AbstractTestResour
 
     @Test
     public final void testListRoot() {
-        String[] results = resourceRoot.list(getMount() + "/");
+        doTestListRoot(true);
+    }
+
+    @Test
+    public final void testListRootNoSlash() {
+        doTestListRoot(false);
+    }
+
+
+    private void doTestListRoot(boolean slash) {
+        String mount = getMount();
+        if (!slash && mount.length() == 0) {
+            return;
+        }
+
+        String[] results = resourceRoot.list(mount + (slash ? "/" : ""));
 
         Set<String> expected = new HashSet<>();
         expected.add("d1");
@@ -192,7 +224,22 @@ public abstract class AbstractTestResour
 
     @Test
     public final void testListWebAppPathsRoot() {
-        Set<String> results = resourceRoot.listWebAppPaths(getMount() + "/");
+        doTestListWebAppPathsRoot(true);
+    }
+
+    @Test
+    public final void testListWebAppPathsRootNoSlash() {
+        doTestListWebAppPathsRoot(false);
+    }
+
+
+    private void doTestListWebAppPathsRoot(boolean slash) {
+        String mount = getMount();
+        if (!slash && mount.length() == 0) {
+            return;
+        }
+
+        Set<String> results = resourceRoot.listWebAppPaths(mount + (slash ? "/" : ""));
 
         Set<String> expected = new HashSet<>();
         expected.add(getMount() + "/d1/");

Modified: tomcat/trunk/webapps/docs/changelog.xml
URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1577103&r1=1577102&r2=1577103&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Thu Mar 13 10:42:49 2014
@@ -112,6 +112,12 @@
         <bug>56246</bug>: Fix NullPointerException in MemoryRealm when
         authenticating an unknown user. (markt)
       </fix>
+      <fix>
+        <bug>56253</bug>: When listing resources that are provided by a JAR, fix
+        possible <code>StringIndexOutOfBoundsException</code>s. Add some unit
+        tests for this and similar scenarios and fix the additional issues those
+        unit tests identified. Based on a patch by Larry Isaacs. (markt) 
+      </fix>
     </changelog>
   </subsection>
   <subsection name="Coyote">



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org