Skip to content

Commit

Permalink
Merge pull request #4701 from MichaelEischer/better-streampack-errors
Browse files Browse the repository at this point in the history
repository: Improve StreamPack error messages
  • Loading branch information
MichaelEischer committed Feb 18, 2024
2 parents 80754db + 4c3218e commit cfbeb2c
Showing 1 changed file with 9 additions and 6 deletions.
15 changes: 9 additions & 6 deletions internal/repository/repository.go
Original file line number Diff line number Diff line change
Expand Up @@ -1079,7 +1079,7 @@ func (b *PackBlobIterator) Next() (PackBlobValue, error) {

skipBytes := int(entry.Offset - b.currentOffset)
if skipBytes < 0 {
return PackBlobValue{}, errors.Errorf("overlapping blobs in pack %v", b.packID)
return PackBlobValue{}, fmt.Errorf("overlapping blobs in pack %v", b.packID)
}

_, err := b.rd.Discard(skipBytes)
Expand All @@ -1099,38 +1099,41 @@ func (b *PackBlobIterator) Next() (PackBlobValue, error) {
n, err := io.ReadFull(b.rd, b.buf)
if err != nil {
debug.Log(" read error %v", err)
return PackBlobValue{}, errors.Wrap(err, "ReadFull")
return PackBlobValue{}, fmt.Errorf("readFull: %w", err)
}

if n != len(b.buf) {
return PackBlobValue{}, errors.Errorf("read blob %v from %v: not enough bytes read, want %v, got %v",
return PackBlobValue{}, fmt.Errorf("read blob %v from %v: not enough bytes read, want %v, got %v",
h, b.packID.Str(), len(b.buf), n)
}
b.currentOffset = entry.Offset + entry.Length

if int(entry.Length) <= b.key.NonceSize() {
debug.Log("%v", b.blobs)
return PackBlobValue{}, errors.Errorf("invalid blob length %v", entry)
return PackBlobValue{}, fmt.Errorf("invalid blob length %v", entry)
}

// decryption errors are likely permanent, give the caller a chance to skip them
nonce, ciphertext := b.buf[:b.key.NonceSize()], b.buf[b.key.NonceSize():]
plaintext, err := b.key.Open(ciphertext[:0], nonce, ciphertext, nil)
if err != nil {
err = fmt.Errorf("decrypting blob %v from %v failed: %w", h, b.packID.Str(), err)
}
if err == nil && entry.IsCompressed() {
// DecodeAll will allocate a slice if it is not large enough since it
// knows the decompressed size (because we're using EncodeAll)
b.decode, err = b.dec.DecodeAll(plaintext, b.decode[:0])
plaintext = b.decode
if err != nil {
err = errors.Errorf("decompressing blob %v failed: %v", h, err)
err = fmt.Errorf("decompressing blob %v from %v failed: %w", h, b.packID.Str(), err)
}
}
if err == nil {
id := restic.Hash(plaintext)
if !id.Equal(entry.ID) {
debug.Log("read blob %v/%v from %v: wrong data returned, hash is %v",
h.Type, h.ID, b.packID.Str(), id)
err = errors.Errorf("read blob %v from %v: wrong data returned, hash is %v",
err = fmt.Errorf("read blob %v from %v: wrong data returned, hash is %v",
h, b.packID.Str(), id)
}
}
Expand Down

0 comments on commit cfbeb2c

Please sign in to comment.