Browse Source

Merge pull request #2 from ikkeps/master

Fix handling of block lengths
Pierre Curto 10 years ago
parent
commit
856e77b716
2 changed files with 7 additions and 6 deletions
  1. 5 4
      reader.go
  2. 2 2
      writer.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

+ 2 - 2
writer.go

@@ -245,9 +245,9 @@ func (z *Writer) compressBlock(zb *block) {
 
 // writeBlock writes a frame block to the underlying io.Writer (size, data).
 func (z *Writer) writeBlock(zb *block) (int, error) {
-	bLen := int32(len(zb.zdata))
+	bLen := uint32(len(zb.zdata))
 	if !zb.compressed {
-		bLen = -bLen
+		bLen |= 1 << 31
 	}
 
 	n := 0