Bug 65397 - NullPointerException during jar scanning with jar symlinked into WEB-INF/lib
Summary: NullPointerException during jar scanning with jar symlinked into WEB-INF/lib
Status: RESOLVED FIXED
Alias: None
Product: Tomcat 9
Classification: Unclassified
Component: Util (show other bugs)
Version: 9.0.48
Hardware: Macintosh All
: P2 normal (vote)
Target Milestone: -----
Assignee: Tomcat Developers Mailing List
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2021-06-24 10:41 UTC by Andy Wilkinson
Modified: 2021-07-19 09:03 UTC (History)
0 users



Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Andy Wilkinson 2021-06-24 10:41:10 UTC
Symlinking a jar into WEB-INF/lib results in a NullPointerException during scanning for web fragments:

Caused by: java.lang.NullPointerException
    at org.apache.tomcat.util.scan.StandardJarScanner.process(StandardJarScanner.java:382)
    at org.apache.tomcat.util.scan.StandardJarScanner.scan(StandardJarScanner.java:195)
    at org.apache.catalina.startup.ContextConfig.processJarsForWebFragments(ContextConfig.java:2136)
    at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1289)
    at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:986)
    at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:303)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5135)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
    ... 38 more


This behaviour can be reproduced with the following steps:

wget https://apache.mirrors.nublue.co.uk/tomcat/tomcat-9/v9.0.48/bin/apache-tomcat-9.0.48.tar.gz  
tar -xzf apache-tomcat-9.0.48.tar.gz
mkdir -p apache-tomcat-9.0.48/webapps/symlink-problem/WEB-INF/lib
wget https://repo.spring.io/artifactory/libs-release-local/org/springframework/cloud/spring-cloud-bindings/1.7.1/spring-cloud-bindings-1.7.1.jar
ln -s spring-cloud-bindings-1.7.1.jar apache-tomcat-9.0.48/webapps/symlink-problem/WEB-INF/lib
apache-tomcat-9.0.48/bin/catalina.sh run

I don't believe that the specific jar that's symlinked is important, any jar will reproduce the failure. The problem also occurs with <Resources allowLinking="true"/> added to conf/context.xml.

We've also seen a similar problem with embedded Tomcat when scanning for tag libraries. Please see https://github.com/spring-projects/spring-boot/issues/27075 for some further details.
Comment 1 Mark Thomas 2021-06-24 12:13:01 UTC
I can confirm that linking any JAR does appear to trigger this.

My testing with both main (10.1.x) and 9.0.x is that adding:

<Resources allowLinking="true" />

to conf/context.xml does work around the issue. I don't recall any recent changes to resource handling that would explain why this works for me but not for you.
Comment 2 Mark Thomas 2021-06-24 15:15:31 UTC
Thanks for the report.

Fixed in:
- 10.1.x for 10.1.0-M2 onwards
- 10.0.x for 10.0.8 onwards
- 9.0.x for 9.0.49 onwards
- 8.5.x for 8.5.69 onwards
Comment 3 Martin Knoblauch 2021-07-19 07:28:21 UTC
Hi,

 sorry, but I do not think this is completely fixed. When moving from 9.0.48 to 9.0.50, we get a nasty stack trace that is cured by adding 

<Resources allowLinking="true" />

There is definitely no warning about a mis-configuration as I would have expected from the 9.0.49 change log entry. We are using symbolic links on a few levels of our installation. There is no symbolic linking directly in WEB-INF/lib. So it seems to be somewhere else. Shall I open an new report? At the moment I do not have an easy reproducer.

18-Jul-2021 14:06:07.991 INFO [main] org.apache.myfaces.config.DefaultFacesConfigurationProvider.getClassloaderFacesConfig Reading config : jar:file:/net/ltsdm01/fs1/cb2/Portals/smgr2021.2
-GA-final-r10889/apache-tomcat-9.0.50/webapps/cb2/WEB-INF/lib/richfaces-a4j-4.5.1.Final.jar!/META-INF/behaviors-handler-delegate.faces-config.xml
18-Jul-2021 14:06:07.992 INFO [main] org.apache.myfaces.config.DefaultFacesConfigurationProvider.getContextSpecifiedFacesConfig Reading config /WEB-INF/sdm-facelets-config.xml
18-Jul-2021 14:06:08.024 SEVERE [main] org.apache.myfaces.webapp.AbstractFacesInitializer.initFaces An error occured while initializing MyFaces: String index out of range: -25
	java.lang.StringIndexOutOfBoundsException: String index out of range: -25
		at java.base/java.lang.String.substring(String.java:1841)
		at org.apache.catalina.webresources.DirResourceSet.listWebAppPaths(DirResourceSet.java:175)
		at org.apache.catalina.webresources.StandardRoot.listWebAppPaths(StandardRoot.java:149)
		at org.apache.catalina.core.ApplicationContext.getResourcePaths(ApplicationContext.java:602)
		at org.apache.catalina.core.ApplicationContextFacade.getResourcePaths(ApplicationContextFacade.java:183)
		at org.apache.myfaces.context.servlet.ServletExternalContextImplBase.getResourcePaths(ServletExternalContextImplBase.java:142)
		at org.apache.myfaces.config.DefaultFacesConfigurationProvider.getFacesFlowFacesConfig(DefaultFacesConfigurationProvider.java:583)
		at org.apache.myfaces.config.DefaultFacesConfigurationMerger.getFacesConfigData(DefaultFacesConfigurationMerger.java:111)
		at org.apache.myfaces.config.FacesConfigurator.configure(FacesConfigurator.java:474)
		at org.apache.myfaces.webapp.AbstractFacesInitializer.buildConfiguration(AbstractFacesInitializer.java:416)
		at org.apache.myfaces.webapp.Jsp21FacesInitializer.initContainerIntegration(Jsp21FacesInitializer.java:73)
		at org.apache.myfaces.webapp.AbstractFacesInitializer.initFaces(AbstractFacesInitializer.java:172)
		at org.apache.myfaces.webapp.StartupServletContextListener.contextInitialized(StartupServletContextListener.java:119)
		at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4768)
		at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5230)
		at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
		at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1398)
		at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1388)
		at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
		at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
		at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140)
		at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:921)
		at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:835)
		at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
		at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1398)
		at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1388)
		at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
		at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
		at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140)
		at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:921)
		at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:263)
		at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
		at org.apache.catalina.core.StandardService.startInternal(StandardService.java:437)
		at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
		at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:934)
		at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
		at org.apache.catalina.startup.Catalina.start(Catalina.java:772)
		at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
		at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
		at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
		at java.base/java.lang.reflect.Method.invoke(Method.java:566)
		at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:345)
		at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:476)
Comment 4 Mark Thomas 2021-07-19 07:30:54 UTC
That is a regression in this fix and is tracked as bug 65433
Comment 5 Martin Knoblauch 2021-07-19 09:03:58 UTC
Thanks for clarifying.