From b89c7ebefe685e5747c2fc6eaba2617a040968f2 Mon Sep 17 00:00:00 2001 From: Greg Wilkins Date: Mon, 19 Feb 2024 09:28:16 +0100 Subject: [PATCH] Do not throw from HttpChannelState.read() method (#11369) Fixes #11363 by ensuring that read never throws, but instead returns an Error chunk. --- .../server/internal/HttpChannelState.java | 42 +++++++++++-------- 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/internal/HttpChannelState.java b/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/internal/HttpChannelState.java index c4b78d7d1bb3..f12990c68aa1 100644 --- a/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/internal/HttpChannelState.java +++ b/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/internal/HttpChannelState.java @@ -867,31 +867,37 @@ public long getLength() @Override public Content.Chunk read() { - HttpStream stream; - try (AutoLock ignored = _lock.lock()) + try { - HttpChannelState httpChannel = lockedGetHttpChannelState(); - - Content.Chunk error = httpChannel._readFailure; - httpChannel._readFailure = Content.Chunk.next(error); - if (error != null) - return error; + HttpStream stream; + try (AutoLock ignored = _lock.lock()) + { + HttpChannelState httpChannel = lockedGetHttpChannelState(); - stream = httpChannel._stream; - } + Content.Chunk error = httpChannel._readFailure; + httpChannel._readFailure = Content.Chunk.next(error); + if (error != null) + return error; - Content.Chunk chunk = stream.read(); + stream = httpChannel._stream; + } + Content.Chunk chunk = stream.read(); - if (LOG.isDebugEnabled()) - LOG.debug("read {}", chunk); + if (LOG.isDebugEnabled()) + LOG.debug("read {}", chunk); - if (chunk != null && chunk.hasRemaining()) - _contentBytesRead.add(chunk.getByteBuffer().remaining()); + if (chunk != null && chunk.hasRemaining()) + _contentBytesRead.add(chunk.getByteBuffer().remaining()); - if (chunk instanceof Trailers trailers) - _trailers = trailers.getTrailers(); + if (chunk instanceof Trailers trailers) + _trailers = trailers.getTrailers(); - return chunk; + return chunk; + } + catch (Throwable t) + { + return Content.Chunk.from(t, true); + } } @Override