Merge pull request #4772 from MichaelEischer/better-error-on-too-large-blob

repository: Better error message if blob is larger than 4GB
This commit is contained in:
Michael Eischer 2024-04-22 21:45:06 +02:00 committed by GitHub
commit f7632de3d6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 7 additions and 3 deletions

View file

@ -5,6 +5,7 @@ import (
"encoding/json"
"fmt"
"io"
"math"
"sync"
"time"
@ -69,11 +70,9 @@ func (idx *Index) addToPacks(id restic.ID) int {
return len(idx.packs) - 1
}
const maxuint32 = 1<<32 - 1
func (idx *Index) store(packIndex int, blob restic.Blob) {
// assert that offset and length fit into uint32!
if blob.Offset > maxuint32 || blob.Length > maxuint32 || blob.UncompressedLength > maxuint32 {
if blob.Offset > math.MaxUint32 || blob.Length > math.MaxUint32 || blob.UncompressedLength > math.MaxUint32 {
panic("offset or length does not fit in uint32. You have packs > 4GB!")
}

View file

@ -6,6 +6,7 @@ import (
"context"
"fmt"
"io"
"math"
"os"
"runtime"
"sort"
@ -917,6 +918,10 @@ func (r *Repository) Close() error {
// occupies in the repo (compressed or not, including encryption overhead).
func (r *Repository) SaveBlob(ctx context.Context, t restic.BlobType, buf []byte, id restic.ID, storeDuplicate bool) (newID restic.ID, known bool, size int, err error) {
if int64(len(buf)) > math.MaxUint32 {
return restic.ID{}, false, 0, fmt.Errorf("blob is larger than 4GB")
}
// compute plaintext hash if not already set
if id.IsNull() {
// Special case the hash calculation for all zero chunks. This is especially