Author: markt Date: Tue Apr 4 14:04:21 2017 New Revision: 1790119 URL: http://svn.apache.org/viewvc?rev=1790119&view=rev Log: Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=60940 Improve the handling of the META-INF/ and META-INF/MANIFEST.MF entries for Jar files located in /WEB-INF/lib when running a web application from a packed WAR file.
Added: tomcat/trunk/test/org/apache/catalina/webresources/TestJarWarResourceSet.java Modified: tomcat/trunk/java/org/apache/catalina/util/ExtensionValidator.java tomcat/trunk/java/org/apache/catalina/webresources/JarWarResourceSet.java tomcat/trunk/webapps/docs/changelog.xml Modified: tomcat/trunk/java/org/apache/catalina/util/ExtensionValidator.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/util/ExtensionValidator.java?rev=1790119&r1=1790118&r2=1790119&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/util/ExtensionValidator.java (original) +++ tomcat/trunk/java/org/apache/catalina/util/ExtensionValidator.java Tue Apr 4 14:04:21 2017 @@ -150,12 +150,11 @@ public final class ExtensionValidator { if (manifestResource.isFile()) { // Primarily used for error reporting String jarName = manifestResource.getURL().toExternalForm(); - Manifest jmanifest = null; - try (InputStream is = manifestResource.getInputStream()) { - jmanifest = new Manifest(is); - ManifestResource mre = new ManifestResource(jarName, - jmanifest, ManifestResource.APPLICATION); - appManifestResources.add(mre); + Manifest jmanifest = manifestResource.getManifest(); + if (jmanifest != null) { + ManifestResource mre = new ManifestResource(jarName, + jmanifest, ManifestResource.APPLICATION); + appManifestResources.add(mre); } } } 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=1790119&r1=1790118&r2=1790119&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/webresources/JarWarResourceSet.java (original) +++ tomcat/trunk/java/org/apache/catalina/webresources/JarWarResourceSet.java Tue Apr 4 14:04:21 2017 @@ -107,11 +107,28 @@ public class JarWarResourceSet extends A try (JarInputStream jarIs = new JarInputStream(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); + } + if (jarIs.getManifest() != null) { + JarEntry manifest = new JarEntry("META-INF/MANIFEST.MF"); + archiveEntries.put(manifest.getName(), manifest); + } } } catch (IOException ioe) { // Should never happen Added: tomcat/trunk/test/org/apache/catalina/webresources/TestJarWarResourceSet.java URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/webresources/TestJarWarResourceSet.java?rev=1790119&view=auto ============================================================================== --- tomcat/trunk/test/org/apache/catalina/webresources/TestJarWarResourceSet.java (added) +++ tomcat/trunk/test/org/apache/catalina/webresources/TestJarWarResourceSet.java Tue Apr 4 14:04:21 2017 @@ -0,0 +1,40 @@ +package org.apache.catalina.webresources; + +import java.io.File; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import org.apache.catalina.Context; +import org.apache.catalina.LifecycleException; +import org.apache.catalina.WebResource; +import org.apache.catalina.startup.Tomcat; +import org.apache.catalina.startup.TomcatBaseTest; + +public class TestJarWarResourceSet extends TomcatBaseTest { + + @Before + public void register() { + TomcatURLStreamHandlerFactory.register(); + } + + + @Test + public void testJarWarMetaInf() throws LifecycleException { + Tomcat tomcat = getTomcatInstance(); + + File warFile = new File("test/webresources/war-url-connection.war"); + Context ctx = tomcat.addContext("", warFile.getAbsolutePath()); + + tomcat.start(); + + StandardRoot root = (StandardRoot) ctx.getResources(); + + WebResource[] results = root.getClassLoaderResources("/META-INF"); + + Assert.assertNotNull(results); + Assert.assertEquals(1, results.length); + Assert.assertNotNull(results[0].getURL()); + } +} Modified: tomcat/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1790119&r1=1790118&r2=1790119&view=diff ============================================================================== --- tomcat/trunk/webapps/docs/changelog.xml (original) +++ tomcat/trunk/webapps/docs/changelog.xml Tue Apr 4 14:04:21 2017 @@ -64,6 +64,12 @@ Avoid a <code>NullPointerException</code> when reading attributes for a running HTTP connector where TLS is not enabled. (markt) </fix> + <fix> + <bug>60940</bug>: Improve the handling of the <code>META-INF/</code> and + <code>META-INF/MANIFEST.MF</code> entries for Jar files located in + <code>/WEB-INF/lib</code> when running a web application from a packed + WAR file. (markt) + </fix> </changelog> </subsection> <subsection name="Jasper"> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org