kovidgoyal/kitty · error

There were %d leftover bytes in the signature data

Error message

There were %d leftover bytes in the signature data

What it means

After consuming all signature blocks, FinishSignatureData found unconsumed bytes left over — the stream length is not consistent with the header's declared block count, indicating truncation, corruption, or extra data.

Source

Thrown at tools/rsync/api.go:124

	self.rsync.BlockSize = block_size
	self.signature = make([]BlockHash, 0, 1024)
	return
}

func (self *Api) read_signature_blocks(data []byte) (consumed int) {
	block_hash_size := self.rsync.HashSize() + 12
	for ; len(data) >= block_hash_size; data = data[block_hash_size:] {
		bl := BlockHash{}
		bl.Unserialize(data[:block_hash_size])
		self.signature = append(self.signature, bl)
		consumed += block_hash_size
	}
	return
}

func (self *Differ) FinishSignatureData() (err error) {
	if len(self.unconsumed_signature_data) > 0 {
		return fmt.Errorf("There were %d leftover bytes in the signature data", len(self.unconsumed_signature_data))
	}
	self.unconsumed_signature_data = nil
	if !self.rsync.HasHasher() {
		return fmt.Errorf("No header was found in the signature data")
	}
	return
}

func (self *Patcher) update_delta(data []byte) (consumed int, err error) {
	op := Operation{}
	for len(data) > 0 {
		n, uerr := op.Unserialize(data)
		if uerr == nil {
			consumed += n
			data = data[n:]
			if err = self.rsync.ApplyDelta(self.delta_output, self.delta_input, op); err != nil {
				return
			}

View on GitHub (pinned to 6d5d0c4406)

Solutions

  1. Make sure every chunk of signature data was passed to AddSignatureData before finishing
  2. Verify the transfer framing so no bytes are lost or duplicated
  3. Regenerate and resend the full signature
Defensive patterns

Strategy: try-catch

Try / catch

if err := differ.FinishSignatureData(); err != nil { log.Printf("signature incomplete: %v", err); re-fetch signature and retry once }

Prevention

When it happens

Trigger: Calling FinishSignatureData when AddSignatureData was fed a byte count not matching whole signature blocks plus header; e.g. stopping mid-block or appending trailing bytes.

Common situations: Partial reads from a network/socket, misframed transfers, or calling FinishSignatureData before all data arrived.

Related errors


AI-assisted analysis of kovidgoyal/kitty@6d5d0c4406 (2026-08-27). Data as JSON: /api/errors/84c660320b111257. Report an issue: GitHub.