记wildfly20中servlet StringIndexOutOfBoundsException的bug

今天遇到一个sessionFilter在tomcat中运行正常,部署到wildfly-20.0.0.final中运行报错的bug,记录下

示例代码:

 1 @WebFilter(filterName = "sessionFilter", urlPatterns = "*.do")
 2 @Order(1)
 3 public class SessionFilter implements Filter {
 4 
 5     @Override
 6     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
 7             throws IOException, ServletException {
 8         chain.doFilter(request, response);
 9     }
10 
11    @Override
12     public void init(FilterConfig fConfig) throws ServletException {
13 
14     }
15 
16     @Override
17     public void destroy() {
18 
19     }
20 }

wildfly运行错误,

2022-06-29 16:37:47,551 INFO  [stdout] (default task-116) java.lang.StringIndexOutOfBoundsException: String index out of range: -3
2022-06-29 16:37:47,551 INFO  [stdout] (default task-116)       at java.lang.String.substring(String.java:1967)
2022-06-29 16:37:47,551 INFO  [stdout] (default task-116)       at io.undertow.servlet.spec.HttpServletRequestImpl.getHttpServletMapping(HttpServletRequestImpl.java:255)
2022-06-29 16:37:47,551 INFO  [stdout] (default task-116)       at vip.aaitec.radar.filters.SessionFilter.doFilter(SessionFilter.java:56)
2022-06-29 16:37:47,551 INFO  [stdout] (default task-116)       at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
2022-06-29 16:37:47,551 INFO  [stdout] (default task-116)       at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
2022-06-29 16:37:47,551 INFO  [stdout] (default task-116)       at org.springframework.boot.web.servlet.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:126)
2022-06-29 16:37:47,551 INFO  [stdout] (default task-116)       at org.springframework.boot.web.servlet.support.ErrorPageFilter.access$000(ErrorPageFilter.java:64)
2022-06-29 16:37:47,551 INFO  [stdout] (default task-116)       at org.springframework.boot.web.servlet.support.ErrorPageFilter$1.doFilterInternal(ErrorPageFilter.java:101)
2022-06-29 16:37:47,551 INFO  [stdout] (default task-116)       at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
2022-06-29 16:37:47,551 INFO  [stdout] (default task-116)       at org.springframework.boot.web.servlet.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:119)
2022-06-29 16:37:47,551 INFO  [stdout] (default task-116)       at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
2022-06-29 16:37:47,551 INFO  [stdout] (default task-116)       at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
2022-06-29 16:37:47,551 INFO  [stdout] (default task-116)       at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
2022-06-29 16:37:47,551 INFO  [stdout] (default task-116)       at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
2022-06-29 16:37:47,551 INFO  [stdout] (default task-116)       at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
2022-06-29 16:37:47,551 INFO  [stdout] (default task-116)       at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
2022-06-29 16:37:47,551 INFO  [stdout] (default task-116)       at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)
2022-06-29 16:37:47,551 INFO  [stdout] (default task-116)       at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
2022-06-29 16:37:47,551 INFO  [stdout] (default task-116)       at io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)
2022-06-29 16:37:47,551 INFO  [stdout] (default task-116)       at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
2022-06-29 16:37:47,551 INFO  [stdout] (default task-116)       at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
2022-06-29 16:37:47,551 INFO  [stdout] (default task-116)       at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
2022-06-29 16:37:47,551 INFO  [stdout] (default task-116)       at io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)
2022-06-29 16:37:47,551 INFO  [stdout] (default task-116)       at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:132)
2022-06-29 16:37:47,551 INFO  [stdout] (default task-116)       at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
2022-06-29 16:37:47,551 INFO  [stdout] (default task-116)       at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
2022-06-29 16:37:47,551 INFO  [stdout] (default task-116)       at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
2022-06-29 16:37:47,552 INFO  [stdout] (default task-116)       at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
2022-06-29 16:37:47,552 INFO  [stdout] (default task-116)       at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
2022-06-29 16:37:47,552 INFO  [stdout] (default task-116)       at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
2022-06-29 16:37:47,552 INFO  [stdout] (default task-116)       at io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)
2022-06-29 16:37:47,552 INFO  [stdout] (default task-116)       at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
2022-06-29 16:37:47,552 INFO  [stdout] (default task-116)       at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
2022-06-29 16:37:47,552 INFO  [stdout] (default task-116)       at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
2022-06-29 16:37:47,552 INFO  [stdout] (default task-116)       at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
2022-06-29 16:37:47,552 INFO  [stdout] (default task-116)       at org.wildfly.extension.undertow.deployment.GlobalRequestControllerHandler.handleRequest(GlobalRequestControllerHandler.java:68)
2022-06-29 16:37:47,552 INFO  [stdout] (default task-116)       at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
2022-06-29 16:37:47,552 INFO  [stdout] (default task-116)       at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:269)
2022-06-29 16:37:47,552 INFO  [stdout] (default task-116)       at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:78)
2022-06-29 16:37:47,552 INFO  [stdout] (default task-116)       at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:133)
2022-06-29 16:37:47,552 INFO  [stdout] (default task-116)       at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:130)
2022-06-29 16:37:47,552 INFO  [stdout] (default task-116)       at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)
2022-06-29 16:37:47,552 INFO  [stdout] (default task-116)       at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
2022-06-29 16:37:47,552 INFO  [stdout] (default task-116)       at org.wildfly.extension.undertow.security.SecurityContextThreadSetupAction.lambda$create$0(SecurityContextThreadSetupAction.java:105)
2022-06-29 16:37:47,552 INFO  [stdout] (default task-116)       at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1530)
2022-06-29 16:37:47,552 INFO  [stdout] (default task-116)       at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1530)
2022-06-29 16:37:47,552 INFO  [stdout] (default task-116)       at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1530)
2022-06-29 16:37:47,552 INFO  [stdout] (default task-116)       at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1530)
2022-06-29 16:37:47,552 INFO  [stdout] (default task-116)       at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:249)
2022-06-29 16:37:47,552 INFO  [stdout] (default task-116)       at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:78)
2022-06-29 16:37:47,552 INFO  [stdout] (default task-116)       at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:99)
2022-06-29 16:37:47,552 INFO  [stdout] (default task-116)       at io.undertow.server.Connectors.executeRootHandler(Connectors.java:370)
2022-06-29 16:37:47,552 INFO  [stdout] (default task-116)       at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:830)
2022-06-29 16:37:47,552 INFO  [stdout] (default task-116)       at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
2022-06-29 16:37:47,552 INFO  [stdout] (default task-116)       at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1982)
2022-06-29 16:37:47,552 INFO  [stdout] (default task-116)       at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486)
2022-06-29 16:37:47,552 INFO  [stdout] (default task-116)       at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1377)
2022-06-29 16:37:47,552 INFO  [stdout] (default task-116)       at java.lang.Thread.run(Thread.java:748)

 

追踪代码到undertow-servlet-2.1.3.Final.jar包下HttpServletRequest的实现类io.undertow.servlet.spec.HttpServletRequestImpl类调用getHttpServletMapping()方法时数组越界,源码如下:

 1     @Override
 2     public HttpServletMapping getHttpServletMapping() {
 3         ServletRequestContext src = exchange.getAttachment(ServletRequestContext.ATTACHMENT_KEY);
 4         ServletPathMatch match = src.getOriginalServletPathMatch();
 5         if(getDispatcherType() == DispatcherType.FORWARD) {
 6             match = src.getServletPathMatch();
 7         }
 8         String matchValue;
 9         switch (match.getMappingMatch()) {
10             case EXACT:
11                 matchValue = match.getMatched();
12                 if(matchValue.startsWith("/")) {
13                     matchValue = matchValue.substring(1);
14                 }
15                 break;
16             case DEFAULT:
17             case CONTEXT_ROOT:
18                 matchValue = "";
19                 break;
20             case PATH:
21                 matchValue = match.getRemaining();
22                 if(matchValue.startsWith("/")) {
23                     matchValue = matchValue.substring(1);
24                 }
25                 break;
26             case EXTENSION:
27                 matchValue = match.getMatched().substring(0, match.getMatched().length() - match.getMatchString().length() + 1);//此处越界
28                 if(matchValue.startsWith("/")) {
29                     matchValue = matchValue.substring(1);
30                 }
31                 break;
32             default:
33                 matchValue = match.getRemaining();
34         }
35         return new MappingImpl(matchValue, match.getMatchString(), match.getMappingMatch(), match.getServletChain().getManagedServlet().getServletInfo().getName());
36     }

 

 

修复方案:升级wildfly,undertow-servlet版本到2.2.6.Final以上。

BUG参见:https://issues.redhat.com/browse/UNDERTOW-1844

posted @ 2022-06-29 18:04  脸探书丛  阅读(92)  评论(0)    收藏  举报