From 07472758ee55eecafb802c0cef2b46ad90efb8b9 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Fri, 5 Apr 2024 18:03:44 +0200 Subject: [PATCH 1/3] Detect Undertow RequestTooBigException message in handleParseFailure Closes gh-32549 --- .../StandardMultipartHttpServletRequest.java | 5 +++-- ...andardMultipartHttpServletRequestTests.java | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/web/multipart/support/StandardMultipartHttpServletRequest.java b/spring-web/src/main/java/org/springframework/web/multipart/support/StandardMultipartHttpServletRequest.java index e0d1a3a68d..b1d2191ead 100644 --- a/spring-web/src/main/java/org/springframework/web/multipart/support/StandardMultipartHttpServletRequest.java +++ b/spring-web/src/main/java/org/springframework/web/multipart/support/StandardMultipartHttpServletRequest.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2023 the original author or authors. + * Copyright 2002-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -118,7 +118,8 @@ public class StandardMultipartHttpServletRequest extends AbstractMultipartHttpSe String msg = cause.getMessage(); if (msg != null) { msg = msg.toLowerCase(); - if (msg.contains("exceed") && (msg.contains("size") || msg.contains("length"))) { + if ((msg.contains("exceed") && (msg.contains("size") || msg.contains("length"))) || + (msg.contains("request") && (msg.contains("big") || msg.contains("large")))) { throw new MaxUploadSizeExceededException(-1, ex); } } diff --git a/spring-web/src/test/java/org/springframework/web/multipart/support/StandardMultipartHttpServletRequestTests.java b/spring-web/src/test/java/org/springframework/web/multipart/support/StandardMultipartHttpServletRequestTests.java index 4a3b2613bd..dfdadda286 100644 --- a/spring-web/src/test/java/org/springframework/web/multipart/support/StandardMultipartHttpServletRequestTests.java +++ b/spring-web/src/test/java/org/springframework/web/multipart/support/StandardMultipartHttpServletRequestTests.java @@ -123,6 +123,14 @@ class StandardMultipartHttpServletRequestTests { .isThrownBy(() -> requestWithException(ex)).withCause(ex); } + @Test // gh-32549 + void undertowRequestTooBigException() { + IOException ex = new IOException("Connection terminated as request was larger than 10000"); + + assertThatExceptionOfType(MaxUploadSizeExceededException.class) + .isThrownBy(() -> requestWithException(ex)).withCause(ex); + } + private static StandardMultipartHttpServletRequest requestWithPart(String name, String disposition, String content) { MockHttpServletRequest request = new MockHttpServletRequest(); @@ -142,4 +150,14 @@ class StandardMultipartHttpServletRequestTests { return new StandardMultipartHttpServletRequest(request); } + private static StandardMultipartHttpServletRequest requestWithException(IOException ex) { + MockHttpServletRequest request = new MockHttpServletRequest() { + @Override + public Collection getParts() throws IOException { + throw ex; + } + }; + return new StandardMultipartHttpServletRequest(request); + } + } From 84963ba4d865e995fc17483a7cc857bdce595e2f Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Fri, 5 Apr 2024 18:04:08 +0200 Subject: [PATCH 2/3] Polishing --- .../main/java/org/springframework/core/CoroutinesUtils.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/spring-core/src/main/java/org/springframework/core/CoroutinesUtils.java b/spring-core/src/main/java/org/springframework/core/CoroutinesUtils.java index d4c14078a5..125d5a6e4d 100644 --- a/spring-core/src/main/java/org/springframework/core/CoroutinesUtils.java +++ b/spring-core/src/main/java/org/springframework/core/CoroutinesUtils.java @@ -128,8 +128,9 @@ public abstract class CoroutinesUtils { Object arg = args[index]; if (!(parameter.isOptional() && arg == null)) { KType type = parameter.getType(); - if (!(type.isMarkedNullable() && arg == null) && type.getClassifier() instanceof KClass kClass - && KotlinDetector.isInlineClass(JvmClassMappingKt.getJavaClass(kClass))) { + if (!(type.isMarkedNullable() && arg == null) && + type.getClassifier() instanceof KClass kClass && + KotlinDetector.isInlineClass(JvmClassMappingKt.getJavaClass(kClass))) { KFunction constructor = KClasses.getPrimaryConstructor(kClass); if (!KCallablesJvm.isAccessible(constructor)) { KCallablesJvm.setAccessible(constructor, true); From 67a81004a2edc43e78e8a85a25ec01304cf2edd3 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Fri, 5 Apr 2024 18:04:58 +0200 Subject: [PATCH 3/3] Upgrade to AspectJ 1.9.22, Groovy 4.0.20, Tomcat 10.1.20, Netty 4.1.108, OpenPDF 1.3.43, Woodstox 6.6.2, Checkstyle 10.15 --- .../build/CheckstyleConventions.java | 2 +- framework-platform/framework-platform.gradle | 22 +++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/buildSrc/src/main/java/org/springframework/build/CheckstyleConventions.java b/buildSrc/src/main/java/org/springframework/build/CheckstyleConventions.java index 23507cc62d..8d6afe7af8 100644 --- a/buildSrc/src/main/java/org/springframework/build/CheckstyleConventions.java +++ b/buildSrc/src/main/java/org/springframework/build/CheckstyleConventions.java @@ -50,7 +50,7 @@ public class CheckstyleConventions { project.getPlugins().apply(CheckstylePlugin.class); project.getTasks().withType(Checkstyle.class).forEach(checkstyle -> checkstyle.getMaxHeapSize().set("1g")); CheckstyleExtension checkstyle = project.getExtensions().getByType(CheckstyleExtension.class); - checkstyle.setToolVersion("10.14.2"); + checkstyle.setToolVersion("10.15.0"); checkstyle.getConfigDirectory().set(project.getRootProject().file("src/checkstyle")); String version = SpringJavaFormatPlugin.class.getPackage().getImplementationVersion(); DependencySet checkstyleDependencies = project.getConfigurations().getByName("checkstyle").getDependencies(); diff --git a/framework-platform/framework-platform.gradle b/framework-platform/framework-platform.gradle index b72a5b8cbb..886b85ebb2 100644 --- a/framework-platform/framework-platform.gradle +++ b/framework-platform/framework-platform.gradle @@ -9,11 +9,11 @@ javaPlatform { dependencies { api(platform("com.fasterxml.jackson:jackson-bom:2.15.4")) api(platform("io.micrometer:micrometer-bom:1.12.4")) - api(platform("io.netty:netty-bom:4.1.107.Final")) + api(platform("io.netty:netty-bom:4.1.108.Final")) api(platform("io.netty:netty5-bom:5.0.0.Alpha5")) api(platform("io.projectreactor:reactor-bom:2023.0.4")) api(platform("io.rsocket:rsocket-bom:1.1.3")) - api(platform("org.apache.groovy:groovy-bom:4.0.19")) + api(platform("org.apache.groovy:groovy-bom:4.0.20")) api(platform("org.apache.logging.log4j:log4j-bom:2.21.1")) api(platform("org.assertj:assertj-bom:3.25.3")) api(platform("org.eclipse.jetty:jetty-bom:12.0.7")) @@ -25,9 +25,9 @@ dependencies { constraints { api("com.fasterxml:aalto-xml:1.3.2") - api("com.fasterxml.woodstox:woodstox-core:6.6.1") + api("com.fasterxml.woodstox:woodstox-core:6.6.2") api("com.github.ben-manes.caffeine:caffeine:3.1.8") - api("com.github.librepdf:openpdf:1.3.42") + api("com.github.librepdf:openpdf:1.3.43") api("com.google.code.findbugs:findbugs:3.0.1") api("com.google.code.findbugs:jsr305:3.0.2") api("com.google.code.gson:gson:2.10.1") @@ -103,13 +103,13 @@ dependencies { api("org.apache.httpcomponents.client5:httpclient5:5.3.1") api("org.apache.httpcomponents.core5:httpcore5-reactive:5.2.4") api("org.apache.poi:poi-ooxml:5.2.5") - api("org.apache.tomcat.embed:tomcat-embed-core:10.1.19") - api("org.apache.tomcat.embed:tomcat-embed-websocket:10.1.19") - api("org.apache.tomcat:tomcat-util:10.1.19") - api("org.apache.tomcat:tomcat-websocket:10.1.19") - api("org.aspectj:aspectjrt:1.9.21.1") - api("org.aspectj:aspectjtools:1.9.21.1") - api("org.aspectj:aspectjweaver:1.9.21.1") + api("org.apache.tomcat.embed:tomcat-embed-core:10.1.20") + api("org.apache.tomcat.embed:tomcat-embed-websocket:10.1.20") + api("org.apache.tomcat:tomcat-util:10.1.20") + api("org.apache.tomcat:tomcat-websocket:10.1.20") + api("org.aspectj:aspectjrt:1.9.22") + api("org.aspectj:aspectjtools:1.9.22") + api("org.aspectj:aspectjweaver:1.9.22") api("org.awaitility:awaitility:4.2.0") api("org.bouncycastle:bcpkix-jdk18on:1.72") api("org.codehaus.jettison:jettison:1.5.4")