[#755] SPDY: fix header block values truncation in decompression

This commit is contained in:
Norman Maurer 2012-11-20 20:09:59 +01:00
parent ff14feeb54
commit 2adebc4c54
3 changed files with 10 additions and 4 deletions

View File

@ -527,8 +527,13 @@ public class SpdyFrameDecoder extends ByteToMessageDecoder<Object> {
return true; return true;
} }
// Perhaps last call to decode filled output buffer // Perhaps last call to decode filled output buffer
headerBlockDecompressor.decode(decompressed); int numBytes;
return decompressed.readableBytes() >= bytes; boolean done;
do {
numBytes = headerBlockDecompressor.decode(decompressed);
done = decompressed.readableBytes() >= bytes;
} while (!done && numBytes > 0);
return done;
} }
private int readLengthField() { private int readLengthField() {

View File

@ -24,6 +24,6 @@ abstract class SpdyHeaderBlockDecompressor {
} }
abstract void setInput(ByteBuf compressed); abstract void setInput(ByteBuf compressed);
abstract void decode(ByteBuf decompressed) throws Exception; abstract int decode(ByteBuf decompressed) throws Exception;
abstract void end(); abstract void end();
} }

View File

@ -43,7 +43,7 @@ class SpdyHeaderBlockZlibDecompressor extends SpdyHeaderBlockDecompressor {
} }
@Override @Override
public void decode(ByteBuf decompressed) throws Exception { public int decode(ByteBuf decompressed) throws Exception {
try { try {
int numBytes = decompressor.inflate(out); int numBytes = decompressor.inflate(out);
if (numBytes == 0 && decompressor.needsDictionary()) { if (numBytes == 0 && decompressor.needsDictionary()) {
@ -55,6 +55,7 @@ class SpdyHeaderBlockZlibDecompressor extends SpdyHeaderBlockDecompressor {
numBytes = decompressor.inflate(out); numBytes = decompressor.inflate(out);
} }
decompressed.writeBytes(out, 0, numBytes); decompressed.writeBytes(out, 0, numBytes);
return numBytes;
} catch (DataFormatException e) { } catch (DataFormatException e) {
throw new SpdyProtocolException( throw new SpdyProtocolException(
"Received invalid header block", e); "Received invalid header block", e);