Browse Source

Fix reader, so it reads block len properly

Alexander Neganov 10 years ago
parent
commit
52c49dea48
1 changed files with 5 additions and 4 deletions
  1. 5 4
      reader.go

+ 5 - 4
reader.go

@@ -223,7 +223,7 @@ func (z *Reader) Read(buf []byte) (n int, err error) {
 // The input buffer is the one that will receive the decompressed data.
 // If the end of the frame is detected, it returns the errEndOfBlock error.
 func (z *Reader) readBlock(buf []byte, b *block) error {
-	var bLen int32
+	var bLen uint32
 	if err := binary.Read(z.src, binary.LittleEndian, &bLen); err != nil {
 		return err
 	}
@@ -232,13 +232,14 @@ func (z *Reader) readBlock(buf []byte, b *block) error {
 	switch {
 	case bLen == 0:
 		return errEndOfBlock
-	case bLen > 0:
+	case bLen & (1<<31) == 0:
 		b.compressed = true
 		b.data = buf
 		b.zdata = make([]byte, bLen)
 	default:
-		b.data = buf[:-bLen]
-		b.zdata = buf[:-bLen]
+		bLen = bLen & (1<<31-1)
+		b.data = buf[:bLen]
+		b.zdata = buf[:bLen]
 	}
 	if _, err := io.ReadFull(z.src, b.zdata); err != nil {
 		return err