From 65fe0f1d2f2880e794fabf854fc8b9e5fc7b32ca Mon Sep 17 00:00:00 2001 From: rstoyanchev Date: Wed, 17 Jun 2026 13:02:41 +0100 Subject: [PATCH] PartGenerator disposes of resources in current State Closes gh-36942 --- .../converter/multipart/PartGenerator.java | 35 +++++++++++++++---- 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/http/converter/multipart/PartGenerator.java b/spring-web/src/main/java/org/springframework/http/converter/multipart/PartGenerator.java index 8a6bc56b494..d04c43ccdbe 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/multipart/PartGenerator.java +++ b/spring-web/src/main/java/org/springframework/http/converter/multipart/PartGenerator.java @@ -112,16 +112,17 @@ final class PartGenerator implements MultipartParser.PartListener { } void deleteParts() { - try { - for (List partList : this.parts.values()) { - for (Part part : partList) { + this.state.dispose(); + for (List parts : this.parts.values()) { + for (Part part : parts) { + try { part.delete(); } + catch (IOException ex) { + // ignored + } } } - catch (IOException ex) { - // ignored - } } @Override @@ -170,6 +171,12 @@ final class PartGenerator implements MultipartParser.PartListener { */ void onBody(DataBuffer dataBuffer, boolean last); + /** + * Clean up resources. + */ + default void dispose() { + } + } /** @@ -305,6 +312,11 @@ final class PartGenerator implements MultipartParser.PartListener { PartGenerator.this.addPart(part); } + @Override + public void dispose() { + this.content.forEach(DataBufferUtils::release); + } + @Override public String toString() { return "IN-MEMORY"; @@ -398,6 +410,17 @@ final class PartGenerator implements MultipartParser.PartListener { } } + @Override + public void dispose() { + closeOutputStream(); + try { + Files.deleteIfExists(this.file); + } + catch (IOException ex) { + // ignored + } + } + @Override public String toString() { return "WRITE-FILE";