From 2adebc4c54ae98565db8e2a3c02b2ffaa0c101fe Mon Sep 17 00:00:00 2001 From: Norman Maurer Date: Tue, 20 Nov 2012 20:09:59 +0100 Subject: [PATCH] [#755] SPDY: fix header block values truncation in decompression --- .../io/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/codec-http/src/main/java/io/netty/handler/codec/spdy/SpdyFrameDecoder.java b/codec-http/src/main/java/io/netty/handler/codec/spdy/SpdyFrameDecoder.java index 9a1ac6a3b2..264e8da625 100644 --- a/codec-http/src/main/java/io/netty/handler/codec/spdy/SpdyFrameDecoder.java +++ b/codec-http/src/main/java/io/netty/handler/codec/spdy/SpdyFrameDecoder.java @@ -527,8 +527,13 @@ public class SpdyFrameDecoder extends ByteToMessageDecoder { 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/codec-http/src/main/java/io/netty/handler/codec/spdy/SpdyHeaderBlockDecompressor.java b/codec-http/src/main/java/io/netty/handler/codec/spdy/SpdyHeaderBlockDecompressor.java index e9d5a23912..6159657833 100644 --- a/codec-http/src/main/java/io/netty/handler/codec/spdy/SpdyHeaderBlockDecompressor.java +++ b/codec-http/src/main/java/io/netty/handler/codec/spdy/SpdyHeaderBlockDecompressor.java @@ -24,6 +24,6 @@ abstract class SpdyHeaderBlockDecompressor { } abstract void setInput(ByteBuf compressed); - abstract void decode(ByteBuf decompressed) throws Exception; + abstract int decode(ByteBuf decompressed) throws Exception; abstract void end(); } diff --git a/codec-http/src/main/java/io/netty/handler/codec/spdy/SpdyHeaderBlockZlibDecompressor.java b/codec-http/src/main/java/io/netty/handler/codec/spdy/SpdyHeaderBlockZlibDecompressor.java index e312460331..761cc2681d 100644 --- a/codec-http/src/main/java/io/netty/handler/codec/spdy/SpdyHeaderBlockZlibDecompressor.java +++ b/codec-http/src/main/java/io/netty/handler/codec/spdy/SpdyHeaderBlockZlibDecompressor.java @@ -43,7 +43,7 @@ class SpdyHeaderBlockZlibDecompressor extends SpdyHeaderBlockDecompressor { } @Override - public void decode(ByteBuf decompressed) throws Exception { + public int decode(ByteBuf decompressed) throws Exception { try { int numBytes = decompressor.inflate(out); if (numBytes == 0 && decompressor.needsDictionary()) { @@ -55,6 +55,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);