From 0cb145ed682177bf6721cac7f3fe4fbdf399e83a Mon Sep 17 00:00:00 2001 From: Jaen Saul Date: Tue, 20 Nov 2012 15:08:32 +0200 Subject: [PATCH] SPDY: fix header block values truncation in decompression --- .../jboss/netty/handler/codec/spdy/SpdyFrameDecoder.java | 9 +++++++-- .../handler/codec/spdy/SpdyHeaderBlockDecompressor.java | 2 +- .../codec/spdy/SpdyHeaderBlockZlibDecompressor.java | 3 ++- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/jboss/netty/handler/codec/spdy/SpdyFrameDecoder.java b/src/main/java/org/jboss/netty/handler/codec/spdy/SpdyFrameDecoder.java index 8cb31e6032..92188d01b7 100644 --- a/src/main/java/org/jboss/netty/handler/codec/spdy/SpdyFrameDecoder.java +++ b/src/main/java/org/jboss/netty/handler/codec/spdy/SpdyFrameDecoder.java @@ -544,8 +544,13 @@ public class SpdyFrameDecoder extends FrameDecoder { return true; } // Perhaps last call to decode filled output buffer - headerBlockDecompressor.decode(decompressed); - return decompressed.readableBytes() >= bytes; + int numBytes; + boolean done; + do { + numBytes = headerBlockDecompressor.decode(decompressed); + done = decompressed.readableBytes() >= bytes; + } while (!done && numBytes > 0); + return done; } private int readLengthField() { diff --git a/src/main/java/org/jboss/netty/handler/codec/spdy/SpdyHeaderBlockDecompressor.java b/src/main/java/org/jboss/netty/handler/codec/spdy/SpdyHeaderBlockDecompressor.java index a434268dcb..83b4727a32 100644 --- a/src/main/java/org/jboss/netty/handler/codec/spdy/SpdyHeaderBlockDecompressor.java +++ b/src/main/java/org/jboss/netty/handler/codec/spdy/SpdyHeaderBlockDecompressor.java @@ -24,6 +24,6 @@ abstract class SpdyHeaderBlockDecompressor { } abstract void setInput(ChannelBuffer compressed); - abstract void decode(ChannelBuffer decompressed) throws Exception; + abstract int decode(ChannelBuffer decompressed) throws Exception; abstract void end(); } diff --git a/src/main/java/org/jboss/netty/handler/codec/spdy/SpdyHeaderBlockZlibDecompressor.java b/src/main/java/org/jboss/netty/handler/codec/spdy/SpdyHeaderBlockZlibDecompressor.java index 1da9a631d8..62ac6dc5da 100644 --- a/src/main/java/org/jboss/netty/handler/codec/spdy/SpdyHeaderBlockZlibDecompressor.java +++ b/src/main/java/org/jboss/netty/handler/codec/spdy/SpdyHeaderBlockZlibDecompressor.java @@ -44,7 +44,7 @@ class SpdyHeaderBlockZlibDecompressor extends SpdyHeaderBlockDecompressor { } @Override - public void decode(ChannelBuffer decompressed) throws Exception { + public int decode(ChannelBuffer decompressed) throws Exception { try { int numBytes = decompressor.inflate(out); if (numBytes == 0 && decompressor.needsDictionary()) { @@ -56,6 +56,7 @@ class SpdyHeaderBlockZlibDecompressor extends SpdyHeaderBlockDecompressor { numBytes = decompressor.inflate(out); } decompressed.writeBytes(out, 0, numBytes); + return numBytes; } catch (DataFormatException e) { throw new SpdyProtocolException( "Received invalid header block", e);