[MGNLCACHE-222] NullPointerException: DefaultCacheKeyGenerator.getParametersFromRequest() Created: 04/Dec/19  Updated: 30/Mar/23

Status: Open
Project: Cache Modules
Component/s: cache core
Affects Version/s: 5.5.7
Fix Version/s: None

Type: Bug Priority: Neutral
Reporter: Ian Cervantez Assignee: Unassigned
Resolution: Unresolved Votes: 1
Labels: maintenance, quickwin, support
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified
Environment:

OS: Ubuntu 16.04.6 LTS
Web Server: Apache Tomcat 9.0.27

Java:
openjdk version "11.0.5" 2019-10-15
OpenJDK Runtime Environment (build 11.0.5+10-post-Ubuntu-2ubuntu116.04)
OpenJDK 64-Bit Server VM (build 11.0.5+10-post-Ubuntu-2ubuntu116.04, mixed mode, sharing)


Attachments: File patch-DefaultCacheKeyGenerator.java.diff    
Template:
Patch included:
Yes
Acceptance criteria:
Empty
Task DoD:
[ ]* Doc/release notes changes? Comment present?
[ ]* Downstream builds green?
[ ]* Solution information and context easily available?
[ ]* Tests
[ ]* FixVersion filled and not yet released
[ ]  Architecture Decision Record (ADR)
Bug DoR:
[ ]* Steps to reproduce, expected, and actual results filled
[ ]* Affected version filled
Date of First Response:
Epic Link: Support
Team: DeveloperX

 Description   

Encountered on Magnolia Cache Core v5.6.2

 

I've got a custom filter in my server filter chain, but I keep getting a NullPointerException.

2019-12-04 01:07:36,235 WARN  com.signalsciences.servlet.filter.SigSciFilter    : An error occurred during the application filter chain: null
2019-12-04 01:07:36,235 DEBUG com.signalsciences.servlet.filter.SigSciFilter    : Error details for application filter chain: 
java.lang.NullPointerException: null
	at info.magnolia.module.cache.cachekey.DefaultCacheKeyGenerator.getParametersFromRequest(DefaultCacheKeyGenerator.java:132) ~[magnolia-cache-core-5.6.2.jar:?]
	at info.magnolia.module.cache.cachekey.DefaultCacheKeyGenerator.generateKey(DefaultCacheKeyGenerator.java:81) ~[magnolia-cache-core-5.6.2.jar:?]
	at info.magnolia.module.cache.cachekey.DefaultCacheKeyGenerator.generateKey(DefaultCacheKeyGenerator.java:57) ~[magnolia-cache-core-5.6.2.jar:?]
	at info.magnolia.module.cache.cachepolicy.Default.retrieveCacheKey(Default.java:184) ~[magnolia-cache-core-5.6.2.jar:?]
	at info.magnolia.module.cache.cachepolicy.Default.shouldCache(Default.java:116) ~[magnolia-cache-core-5.6.2.jar:?]
	at info.magnolia.advancedcache.personalization.cache.PersonalizedCachePolicy.shouldCache(PersonalizedCachePolicy.java:99) ~[magnolia-advanced-cache-personalization-2.0.1.jar:?]
	at info.magnolia.module.cache.filter.CacheFilter.doFilter(CacheFilter.java:200) ~[magnolia-cache-core-5.6.2.jar:?]
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.i18n.I18nContentSupportFilter.doFilter(I18nContentSupportFilter.java:89) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.RangeSupportFilter.doFilter(RangeSupportFilter.java:77) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.security.BaseSecurityFilter.doFilter(BaseSecurityFilter.java:57) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.security.SecurityCallbackFilter.doFilter(SecurityCallbackFilter.java:84) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:59) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.security.LogoutFilter.doFilter(LogoutFilter.java:94) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:59) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.module.site.filters.SiteMergeFilter.doFilter(SiteMergeFilter.java:119) ~[magnolia-site-1.2.2.jar:?]
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.multisite.filters.MultiSiteFilter.doFilter(MultiSiteFilter.java:120) ~[magnolia-module-multisite-1.3.5.jar:?]
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.MultiChannelFilter.doFilter(MultiChannelFilter.java:83) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.module.cache.filter.GZipFilter.doFilter(GZipFilter.java:73) ~[magnolia-cache-core-5.6.2.jar:?]
	at info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:59) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.security.auth.login.LoginFilter.doFilter(LoginFilter.java:127) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.enterprise.registration.RegistrationFilter.doFilter(RegistrationFilter.java:75) ~[magnolia-module-enterprise-5.7.5.jar:?]
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.UnicodeNormalizationFilter.doFilter(UnicodeNormalizationFilter.java:89) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.personalization.preview.filter.PreviewFilter.doFilter(PreviewFilter.java:92) ~[magnolia-personalization-preview-app-1.6.2.jar:?]
	at info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:59) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.ContentTypeFilter.doFilter(ContentTypeFilter.java:155) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.ContextFilter.doFilter(ContextFilter.java:128) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85) ~[magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79) ~[magnolia-core-5.7.5.jar:?]
	at com.signalsciences.servlet.filter.SigSciFilter.doFilter(SigSciFilter.java:372) [sigsci-module-java-2.0.0-shaded-debug.jar:2.0.0]
	at info.magnolia.cms.filters.FilterDecorator.doFilter(FilterDecorator.java:90) [magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85) [magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79) [magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.CompositeFilter.doFilter(CompositeFilter.java:65) [magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85) [magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.SafeDestroyMgnlFilterWrapper.doFilter(SafeDestroyMgnlFilterWrapper.java:107) [magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.MgnlFilterDispatcher.doDispatch(MgnlFilterDispatcher.java:67) [magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.MgnlMainFilter.doFilter(MgnlMainFilter.java:110) [magnolia-core-5.7.5.jar:?]
	at info.magnolia.cms.filters.MgnlMainFilter.doFilter(MgnlMainFilter.java:96) [magnolia-core-5.7.5.jar:?]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [catalina.jar:9.0.27]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [catalina.jar:9.0.27]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) [catalina.jar:9.0.27]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [catalina.jar:9.0.27]
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:526) [catalina.jar:9.0.27]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) [catalina.jar:9.0.27]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [catalina.jar:9.0.27]
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:678) [catalina.jar:9.0.27]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) [catalina.jar:9.0.27]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) [catalina.jar:9.0.27]
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408) [tomcat-coyote.jar:9.0.27]
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-coyote.jar:9.0.27]
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861) [tomcat-coyote.jar:9.0.27]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1579) [tomcat-coyote.jar:9.0.27]
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-coyote.jar:9.0.27]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) [?:?]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [?:?]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-util.jar:9.0.27]
	at java.lang.Thread.run(Thread.java:834) [?:?]

The stack trace leads to line 132 in info.magnolia.module.cache.cachekey.DefaultCacheKeyGenerator.getParametersFromRequest(), a call to val.replace() where val may be null.

DefaultCacheKeyGenerator.java

    // ...
    private Map<String, String> getParametersFromRequest(HttpServletRequest request) {
        Map<String, String> map = new TreeMap<String, String>();
        for (Object obj : request.getParameterMap().entrySet()) {
            Map.Entry<String, String[]> entry = (Map.Entry) obj;
            String[] values = entry.getValue();
            List<String> newValues = new ArrayList<String>();
            for (String val : values) {
                String str = val.replace(";", ";;");
                newValues.add(str);
            }
            String value = StringUtils.join(newValues, ";");
            map.put(entry.getKey(), value);
        }
        return map;
    }
    // ...

Should probably be something like:

    // ...
    private Map<String, String> getParametersFromRequest(HttpServletRequest request) {
        Map<String, String> map = new TreeMap<String, String>();
        for (Object obj : request.getParameterMap().entrySet()) {
            Map.Entry<String, String[]> entry = (Map.Entry) obj;
            String[] values = entry.getValue();
            List<String> newValues = new ArrayList<String>();
            for (String val : values) {
                String str = val;
                if (str != null) {
                    str = str.replace(";", ";;");
                }
                newValues.add(str);
            }
            String value = StringUtils.join(newValues, ";");
            map.put(entry.getKey(), value);
        }
        return map;
    }
    // ...


 Comments   
Comment by David Martin [ 06/May/22 ]

Hi Folks, 

We just encountered what looks like this issue on Magnolia 6.2.17

Cheers, Dave

Comment by Viet Nguyen [ 30/Mar/23 ]

Replace

String str = val.replace(";", ";;");

Using

StringUtils.replace(val, ";", ";;");

For minimal change and minimize testing+maintenance efforts.

Generated at Sun Feb 11 23:53:23 CET 2024 using Jira 9.4.2#940002-sha1:46d1a51de284217efdcb32434eab47a99af2938b.