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 2017/09/12 13:54:01 UTC

svn commit: r1808116 - in /tomcat/trunk: java/org/apache/catalina/webresources/JarWarResourceSet.java java/org/apache/catalina/webresources/TomcatJarInputStream.java webapps/docs/changelog.xml

Author: markt
Date: Tue Sep 12 13:54:01 2017
New Revision: 1808116

URL: http://svn.apache.org/viewvc?rev=1808116&view=rev
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=61503
This corrects a potential regression in the fix for bug 60940 with an alternative solution that adds the JarEntry objects normally skipped by a JarInputStream only if those entries exist.

Added:
    tomcat/trunk/java/org/apache/catalina/webresources/TomcatJarInputStream.java   (with props)
Modified:
    tomcat/trunk/java/org/apache/catalina/webresources/JarWarResourceSet.java
    tomcat/trunk/webapps/docs/changelog.xml

Modified: tomcat/trunk/java/org/apache/catalina/webresources/JarWarResourceSet.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/webresources/JarWarResourceSet.java?rev=1808116&r1=1808115&r2=1808116&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/webresources/JarWarResourceSet.java (original)
+++ tomcat/trunk/java/org/apache/catalina/webresources/JarWarResourceSet.java Tue Sep 12 13:54:01 2017
@@ -106,29 +106,26 @@ public class JarWarResourceSet extends A
                     JarEntry jarFileInWar = warFile.getJarEntry(archivePath);
                     jarFileIs = warFile.getInputStream(jarFileInWar);
 
-                    try (JarInputStream jarIs = new JarInputStream(jarFileIs)) {
+                    try (TomcatJarInputStream jarIs = new TomcatJarInputStream(jarFileIs)) {
                         JarEntry entry = jarIs.getNextJarEntry();
-                        boolean hasMetaInf = false;
                         while (entry != null) {
-                            if (!hasMetaInf && entry.getName().startsWith("META-INF/")) {
-                                hasMetaInf = true;
-                            }
                             archiveEntries.put(entry.getName(), entry);
                             entry = jarIs.getNextJarEntry();
                         }
                         setManifest(jarIs.getManifest());
-                        // Hacks to work-around JarInputStream swallowing these
-                        // entries. The attributes for these entries will be
-                        // incomplete. Making the attributes available would
-                        // require (re-)reading the stream as a ZipInputStream
-                        // and creating JarEntry objects from the ZipEntries.
-                        if (hasMetaInf) {
-                            JarEntry metaInfDir = new JarEntry("META-INF/");
-                            archiveEntries.put(metaInfDir.getName(), metaInfDir);
+                        // Hack to work-around JarInputStream swallowing these
+                        // entries. TomcatJarInputStream is used above which
+                        // extends JarInputStream and the method that creates
+                        // the entries over-ridden so we can a) tell if the
+                        // entries are present and b) cache them so we can
+                        // access them here.
+                        entry = jarIs.getMetaInfEntry();
+                        if (entry != null) {
+                            archiveEntries.put(entry.getName(), entry);
                         }
-                        if (jarIs.getManifest() != null) {
-                            JarEntry manifest = new JarEntry("META-INF/MANIFEST.MF");
-                            archiveEntries.put(manifest.getName(), manifest);
+                        entry = jarIs.getManifestEntry();
+                        if (entry != null) {
+                            archiveEntries.put(entry.getName(), entry);
                         }
                     }
                 } catch (IOException ioe) {

Added: tomcat/trunk/java/org/apache/catalina/webresources/TomcatJarInputStream.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/webresources/TomcatJarInputStream.java?rev=1808116&view=auto
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/webresources/TomcatJarInputStream.java (added)
+++ tomcat/trunk/java/org/apache/catalina/webresources/TomcatJarInputStream.java Tue Sep 12 13:54:01 2017
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.catalina.webresources;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.jar.JarEntry;
+import java.util.jar.JarInputStream;
+import java.util.zip.ZipEntry;
+
+/**
+ * The purpose of this sub-class is to obtain references to the JarEntry objects
+ * for META-INF/ and META-INF/MANIFEST.MF that are otherwise swallowed by the
+ * JarInputStream implementation.
+ */
+public class TomcatJarInputStream extends JarInputStream {
+
+    private JarEntry metaInfEntry;
+    private JarEntry manifestEntry;
+
+
+    TomcatJarInputStream(InputStream in) throws IOException {
+        super(in);
+    }
+
+
+    @Override
+    protected ZipEntry createZipEntry(String name) {
+        ZipEntry ze = super.createZipEntry(name);
+        if (metaInfEntry == null && "META-INF/".equals(name)) {
+            metaInfEntry = (JarEntry) ze;
+        } else if (manifestEntry == null && "META-INF/MANIFESR.MF".equals(name)) {
+            manifestEntry = (JarEntry) ze;
+        }
+        return ze;
+    }
+
+
+    JarEntry getMetaInfEntry() {
+        return metaInfEntry;
+    }
+
+
+    JarEntry getManifestEntry() {
+        return manifestEntry;
+    }
+}

Propchange: tomcat/trunk/java/org/apache/catalina/webresources/TomcatJarInputStream.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: tomcat/trunk/webapps/docs/changelog.xml
URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1808116&r1=1808115&r2=1808116&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Tue Sep 12 13:54:01 2017
@@ -81,6 +81,12 @@
         3875) optional and disabled by default. Based on a patch by jm009.
         (markt)
       </add>
+      <fix>
+        <bug>61503</bug>: This corrects a potential regression in the fix for
+        <bug>60940</bug> with an alternative solution that adds the
+        <code>JarEntry</code> objects normally skipped by a
+        <code>JarInputStream</code> only if those entries exist. (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