shithub: furgit

Download patch

ref: 970f5d2985a7a01e8edb9f3fe2bfc926ebb800e2
parent: 0f16511df2531d4d1d15434855bdd96b38021836
author: Runxi Yu <me@runxiyu.org>
date: Sat Feb 21 15:42:25 EST 2026

internal/zlib: Fix lints

--- a/internal/zlib/reader.go
+++ b/internal/zlib/reader.go
@@ -105,8 +105,11 @@
 
 	var n int
 	n, z.err = z.decompressor.Read(p)
-	z.digest.Write(p[0:n])
-	if z.err != io.EOF {
+	if _, err := z.digest.Write(p[0:n]); err != nil {
+		z.err = err
+		return n, z.err
+	}
+	if !errors.Is(z.err, io.EOF) {
 		// In the normal case we return here.
 		return n, z.err
 	}
@@ -132,7 +135,7 @@
 // In order for the ZLIB checksum to be verified, the reader must be
 // fully consumed until the [io.EOF].
 func (z *reader) Close() error {
-	if z.err != nil && z.err != io.EOF {
+	if z.err != nil && !errors.Is(z.err, io.EOF) {
 		return z.err
 	}
 	z.err = z.decompressor.Close()
@@ -155,7 +158,7 @@
 	// Read the header (RFC 1950 section 2.2.).
 	_, z.err = io.ReadFull(z.r, z.scratch[0:2])
 	if z.err != nil {
-		if z.err == io.EOF {
+		if errors.Is(z.err, io.EOF) {
 			z.err = io.ErrUnexpectedEOF
 		}
 		return z.err
@@ -169,7 +172,7 @@
 	if haveDict {
 		_, z.err = io.ReadFull(z.r, z.scratch[0:4])
 		if z.err != nil {
-			if z.err == io.EOF {
+			if errors.Is(z.err, io.EOF) {
 				z.err = io.ErrUnexpectedEOF
 			}
 			return z.err
@@ -188,7 +191,11 @@
 			z.decompressor = flate.NewReader(z.r)
 		}
 	} else {
-		z.err = z.decompressor.(flate.Resetter).Reset(z.r, dict)
+		resetter, ok := z.decompressor.(flate.Resetter)
+		if !ok {
+			panic("zlib: pooled decompressor does not implement flate.Resetter")
+		}
+		z.err = resetter.Reset(z.r, dict)
 		if z.err != nil {
 			return z.err
 		}
--- a/internal/zlib/writer.go
+++ b/internal/zlib/writer.go
@@ -118,55 +118,6 @@
 	z.wroteHeader = false
 }
 
-// writeHeader writes the ZLIB header.
-func (z *Writer) writeHeader() (err error) {
-	z.wroteHeader = true
-	// ZLIB has a two-byte header (as documented in RFC 1950).
-	// The first four bits is the CINFO (compression info), which is 7 for the default deflate window size.
-	// The next four bits is the CM (compression method), which is 8 for deflate.
-	z.scratch[0] = 0x78
-	// The next two bits is the FLEVEL (compression level). The four values are:
-	// 0=fastest, 1=fast, 2=default, 3=best.
-	// The next bit, FDICT, is set if a dictionary is given.
-	// The final five FCHECK bits form a mod-31 checksum.
-	switch z.level {
-	case -2, 0, 1:
-		z.scratch[1] = 0 << 6
-	case 2, 3, 4, 5:
-		z.scratch[1] = 1 << 6
-	case 6, -1:
-		z.scratch[1] = 2 << 6
-	case 7, 8, 9:
-		z.scratch[1] = 3 << 6
-	default:
-		panic("unreachable")
-	}
-	if z.dict != nil {
-		z.scratch[1] |= 1 << 5
-	}
-	z.scratch[1] += uint8(31 - binary.BigEndian.Uint16(z.scratch[:2])%31)
-	if _, err = z.w.Write(z.scratch[0:2]); err != nil {
-		return err
-	}
-	if z.dict != nil {
-		// The next four bytes are the Adler-32 checksum of the dictionary.
-		binary.BigEndian.PutUint32(z.scratch[:], adler32.Checksum(z.dict))
-		if _, err = z.w.Write(z.scratch[0:4]); err != nil {
-			return err
-		}
-	}
-	if z.compressor == nil {
-		// Initialize deflater unless the Writer is being reused
-		// after a Reset call.
-		z.compressor, err = flate.NewWriterDict(z.w, z.level, z.dict)
-		if err != nil {
-			return err
-		}
-		z.digest = adler32.New()
-	}
-	return nil
-}
-
 // Write writes a compressed form of p to the underlying [io.Writer]. The
 // compressed bytes are not necessarily flushed until the [Writer] is closed or
 // explicitly flushed.
@@ -185,7 +136,10 @@
 		z.err = err
 		return
 	}
-	z.digest.Write(p)
+	if _, err = z.digest.Write(p); err != nil {
+		z.err = err
+		return 0, z.err
+	}
 	return
 }
 
@@ -223,5 +177,54 @@
 	}
 
 	writerPool.Put(z)
+	return nil
+}
+
+// writeHeader writes the ZLIB header.
+func (z *Writer) writeHeader() (err error) {
+	z.wroteHeader = true
+	// ZLIB has a two-byte header (as documented in RFC 1950).
+	// The first four bits is the CINFO (compression info), which is 7 for the default deflate window size.
+	// The next four bits is the CM (compression method), which is 8 for deflate.
+	z.scratch[0] = 0x78
+	// The next two bits is the FLEVEL (compression level). The four values are:
+	// 0=fastest, 1=fast, 2=default, 3=best.
+	// The next bit, FDICT, is set if a dictionary is given.
+	// The final five FCHECK bits form a mod-31 checksum.
+	switch z.level {
+	case -2, 0, 1:
+		z.scratch[1] = 0 << 6
+	case 2, 3, 4, 5:
+		z.scratch[1] = 1 << 6
+	case 6, -1:
+		z.scratch[1] = 2 << 6
+	case 7, 8, 9:
+		z.scratch[1] = 3 << 6
+	default:
+		panic("unreachable")
+	}
+	if z.dict != nil {
+		z.scratch[1] |= 1 << 5
+	}
+	z.scratch[1] += uint8(31 - binary.BigEndian.Uint16(z.scratch[:2])%31)
+	if _, err = z.w.Write(z.scratch[0:2]); err != nil {
+		return err
+	}
+	if z.dict != nil {
+		// The next four bytes are the Adler-32 checksum of the dictionary.
+		binary.BigEndian.PutUint32(z.scratch[:], adler32.Checksum(z.dict))
+		if _, err = z.w.Write(z.scratch[0:4]); err != nil {
+			return err
+		}
+	}
+	if z.compressor == nil {
+		// Initialize deflater unless the Writer is being reused
+		// after a Reset call.
+		z.compressor, err = flate.NewWriterDict(z.w, z.level, z.dict)
+		if err != nil {
+			return err
+		}
+		z.digest = adler32.New()
+	}
 	return nil
 }
--