From 970f5d2985a7a01e8edb9f3fe2bfc926ebb800e2 Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Sat, 21 Feb 2026 20:42:25 +0800 Subject: internal/zlib: Fix lints --- internal/zlib/reader.go | 19 ++++++--- internal/zlib/writer.go | 103 +++++++++++++++++++++++++----------------------- 2 files changed, 66 insertions(+), 56 deletions(-) (limited to 'internal/zlib') diff --git a/internal/zlib/reader.go b/internal/zlib/reader.go index a34750a5..62fe57a7 100644 --- a/internal/zlib/reader.go +++ b/internal/zlib/reader.go @@ -105,8 +105,11 @@ func (z *reader) Read(p []byte) (int, error) { 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 @@ func (z *reader) Read(p []byte) (int, error) { // 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 @@ func (z *reader) Reset(r io.Reader, dict []byte) error { // 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 @@ func (z *reader) Reset(r io.Reader, dict []byte) error { 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 @@ func (z *reader) Reset(r io.Reader, dict []byte) error { 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 } diff --git a/internal/zlib/writer.go b/internal/zlib/writer.go index bef53cd9..777a32d2 100644 --- a/internal/zlib/writer.go +++ b/internal/zlib/writer.go @@ -118,55 +118,6 @@ func (z *Writer) Reset(w io.Writer) { 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 @@ func (z *Writer) Write(p []byte) (n int, err error) { z.err = err return } - z.digest.Write(p) + if _, err = z.digest.Write(p); err != nil { + z.err = err + return 0, z.err + } return } @@ -225,3 +179,52 @@ func (z *Writer) Close() error { 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 +} -- cgit v1.3.1-10-gc9f91