diff --git a/changelogs/unreleased/10270-Lyndon-Li b/changelogs/unreleased/10270-Lyndon-Li new file mode 100644 index 000000000..5bdc7e773 --- /dev/null +++ b/changelogs/unreleased/10270-Lyndon-Li @@ -0,0 +1 @@ +Cap the metadata decompression in object store \ No newline at end of file diff --git a/pkg/persistence/object_store.go b/pkg/persistence/object_store.go index 8d5207a6e..338ee016e 100644 --- a/pkg/persistence/object_store.go +++ b/pkg/persistence/object_store.go @@ -94,6 +94,7 @@ type BackupStore interface { // DownloadURLTTL is how long a download URL is valid for. const DownloadURLTTL = 10 * time.Minute +const maxDecompressedSize = 1024 * 1024 * 1024 // 1 GB type objectBackupStore struct { objectStore velero.ObjectStore @@ -323,7 +324,8 @@ func (s *objectBackupStore) GetBackupMetadata(name string) (*velerov1api.Backup, } defer res.Close() - data, err := io.ReadAll(res) + limitReader := io.LimitReader(res, maxDecompressedSize) + data, err := io.ReadAll(limitReader) if err != nil { return nil, errors.WithStack(err) } @@ -434,7 +436,9 @@ func decode(jsongzReader io.Reader, into any) error { } defer gzr.Close() - if err := json.NewDecoder(gzr).Decode(into); err != nil { + limitReader := io.LimitReader(gzr, maxDecompressedSize) + + if err := json.NewDecoder(limitReader).Decode(into); err != nil { return errors.Wrap(err, "error decoding object data") }