ref: 1a8842b33d6d83d1754267e087fd7b4f73ca9e91
dir: /packfile/ingest/trailer.go/
package ingest
import (
"bytes"
"errors"
"fmt"
"io"
)
// finishAndFlushTrailer reads trailer hash bytes, verifies trailer checksum,
// and optionally requires the source stream to hit EOF afterward.
func (scanner *streamScanner) finishAndFlushTrailer(requireTrailingEOF bool) error {
if scanner.hashSize <= 0 {
return fmt.Errorf("packfile/ingest: invalid hash size")
}
trailer := make([]byte, scanner.hashSize)
scanner.hashEnabled = false
err := scanner.readFull(trailer)
if err != nil {
return &PackTrailerMismatchError{}
}
scanner.packTrailer = append(scanner.packTrailer[:0], trailer...)
if scanner.n-scanner.off > 0 {
return fmt.Errorf("packfile/ingest: pack has trailing garbage")
}
if !requireTrailingEOF {
computed := scanner.hash.Sum(nil)
if !bytes.Equal(computed, trailer) {
return &PackTrailerMismatchError{}
}
return nil
}
var probe [1]byte
n, err := scanner.Read(probe[:])
if n > 0 || err == nil {
return fmt.Errorf("packfile/ingest: pack has trailing garbage")
}
if !errors.Is(err, io.EOF) {
return err
}
computed := scanner.hash.Sum(nil)
if !bytes.Equal(computed, trailer) {
return &PackTrailerMismatchError{}
}
return nil
}