Fix memory leak in AbstractJackson2Encoder

Fixes a DataBuffer memory leak where a created buffer was not release
if Jackson threw an exception.
This commit is contained in:
Arjen Poutsma
2018-10-18 17:09:53 +02:00
parent d303c8a20f
commit 857b600675

View File

@@ -44,6 +44,7 @@ import org.springframework.core.codec.EncodingException;
import org.springframework.core.codec.Hints;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DataBufferFactory;
import org.springframework.core.io.buffer.DataBufferUtils;
import org.springframework.core.log.LogFormatUtils;
import org.springframework.http.MediaType;
import org.springframework.http.codec.HttpMessageEncoder;
@@ -161,11 +162,14 @@ public abstract class AbstractJackson2Encoder extends Jackson2CodecSupport imple
writer = customizeWriter(writer, mimeType, elementType, hints);
DataBuffer buffer = bufferFactory.allocateBuffer();
boolean release = true;
OutputStream outputStream = buffer.asOutputStream();
try {
JsonGenerator generator = getObjectMapper().getFactory().createGenerator(outputStream, encoding);
JsonGenerator generator =
getObjectMapper().getFactory().createGenerator(outputStream, encoding);
writer.writeValue(generator, value);
release = false;
}
catch (InvalidDefinitionException ex) {
throw new CodecException("Type definition error: " + ex.getType(), ex);
@@ -174,7 +178,13 @@ public abstract class AbstractJackson2Encoder extends Jackson2CodecSupport imple
throw new EncodingException("JSON encoding error: " + ex.getOriginalMessage(), ex);
}
catch (IOException ex) {
throw new IllegalStateException("Unexpected I/O error while writing to data buffer", ex);
throw new IllegalStateException("Unexpected I/O error while writing to data buffer",
ex);
}
finally {
if (release) {
DataBufferUtils.release(buffer);
}
}
return buffer;