From 06002ebe1dc232ac15bcce407e957de7fad35377 Mon Sep 17 00:00:00 2001 From: Lachlan Roberts Date: Wed, 3 Sep 2025 14:22:30 +1000 Subject: [PATCH] Ensure buffer is always released from HTTP/3 HeadersGenerator in case of failure. Signed-off-by: Lachlan Roberts --- .../org/eclipse/jetty/http3/generator/HeadersGenerator.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/jetty-core/jetty-http3/jetty-http3-common/src/main/java/org/eclipse/jetty/http3/generator/HeadersGenerator.java b/jetty-core/jetty-http3/jetty-http3-common/src/main/java/org/eclipse/jetty/http3/generator/HeadersGenerator.java index 495156093006..975b2efd3ec0 100644 --- a/jetty-core/jetty-http3/jetty-http3-common/src/main/java/org/eclipse/jetty/http3/generator/HeadersGenerator.java +++ b/jetty-core/jetty-http3/jetty-http3-common/src/main/java/org/eclipse/jetty/http3/generator/HeadersGenerator.java @@ -54,7 +54,11 @@ private int generateHeadersFrame(ByteBufferPool.Accumulator accumulator, long st int maxHeaderLength = frameTypeLength + VarLenInt.MAX_LENGTH; // The capacity of the buffer is larger than maxLength, but we need to enforce at most maxLength. int maxLength = encoder.getMaxHeadersSize(); + + // Acquire buffer and immediately append to the accumulator so that it is released if a failure occurs. RetainableByteBuffer buffer = getByteBufferPool().acquire(maxHeaderLength + maxLength, useDirectByteBuffers); + accumulator.append(buffer); + ByteBuffer byteBuffer = buffer.getByteBuffer(); BufferUtil.clearToFill(byteBuffer); byteBuffer.position(maxHeaderLength); @@ -70,7 +74,6 @@ private int generateHeadersFrame(ByteBufferPool.Accumulator accumulator, long st VarLenInt.encode(byteBuffer, FrameType.HEADERS.type()); VarLenInt.encode(byteBuffer, dataLength); byteBuffer.position(position); - accumulator.append(buffer); return headerLength + dataLength; } catch (QpackException x)