Skip to content

Commit 857b600

Browse files
committed
Fix memory leak in AbstractJackson2Encoder
Fixes a DataBuffer memory leak where a created buffer was not release if Jackson threw an exception.
1 parent d303c8a commit 857b600

File tree

1 file changed

+12
-2
lines changed

1 file changed

+12
-2
lines changed

spring-web/src/main/java/org/springframework/http/codec/json/AbstractJackson2Encoder.java

+12-2
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import org.springframework.core.codec.Hints;
4545
import org.springframework.core.io.buffer.DataBuffer;
4646
import org.springframework.core.io.buffer.DataBufferFactory;
47+
import org.springframework.core.io.buffer.DataBufferUtils;
4748
import org.springframework.core.log.LogFormatUtils;
4849
import org.springframework.http.MediaType;
4950
import org.springframework.http.codec.HttpMessageEncoder;
@@ -161,11 +162,14 @@ private DataBuffer encodeValue(Object value, @Nullable MimeType mimeType, DataBu
161162
writer = customizeWriter(writer, mimeType, elementType, hints);
162163

163164
DataBuffer buffer = bufferFactory.allocateBuffer();
165+
boolean release = true;
164166
OutputStream outputStream = buffer.asOutputStream();
165167

166168
try {
167-
JsonGenerator generator = getObjectMapper().getFactory().createGenerator(outputStream, encoding);
169+
JsonGenerator generator =
170+
getObjectMapper().getFactory().createGenerator(outputStream, encoding);
168171
writer.writeValue(generator, value);
172+
release = false;
169173
}
170174
catch (InvalidDefinitionException ex) {
171175
throw new CodecException("Type definition error: " + ex.getType(), ex);
@@ -174,7 +178,13 @@ private DataBuffer encodeValue(Object value, @Nullable MimeType mimeType, DataBu
174178
throw new EncodingException("JSON encoding error: " + ex.getOriginalMessage(), ex);
175179
}
176180
catch (IOException ex) {
177-
throw new IllegalStateException("Unexpected I/O error while writing to data buffer", ex);
181+
throw new IllegalStateException("Unexpected I/O error while writing to data buffer",
182+
ex);
183+
}
184+
finally {
185+
if (release) {
186+
DataBufferUtils.release(buffer);
187+
}
178188
}
179189

180190
return buffer;

0 commit comments

Comments
 (0)