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
}
--
⑨