Skip to content

Commit 06f82ef

Browse files
committed
archive: validate digests before use
digest.Algorithm() and digest.Encoded() may panic for invalid digests. Validate prior to calling those methods. Signed-off-by: Samuel Karp <[email protected]> (cherry picked from commit f9c9121) Signed-off-by: Samuel Karp <[email protected]>
1 parent 1eb637f commit 06f82ef

2 files changed

Lines changed: 12 additions & 0 deletions

File tree

images/archive/exporter.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,9 @@ func Export(ctx context.Context, store content.Provider, writer io.Writer, opts
182182
case images.MediaTypeDockerSchema2ManifestList, ocispec.MediaTypeImageIndex:
183183
d, ok := resolvedIndex[desc.Digest]
184184
if !ok {
185+
if err := desc.Digest.Validate(); err != nil {
186+
return err
187+
}
185188
records = append(records, blobRecord(store, desc, &eo.blobRecordOptions))
186189

187190
p, err := content.ReadBlob(ctx, store, desc)
@@ -271,6 +274,9 @@ func Export(ctx context.Context, store content.Provider, writer io.Writer, opts
271274
func getRecords(ctx context.Context, store content.Provider, desc ocispec.Descriptor, algorithms map[string]struct{}, brOpts *blobRecordOptions) ([]tarRecord, error) {
272275
var records []tarRecord
273276
exportHandler := func(ctx context.Context, desc ocispec.Descriptor) ([]ocispec.Descriptor, error) {
277+
if err := desc.Digest.Validate(); err != nil {
278+
return nil, err
279+
}
274280
records = append(records, blobRecord(store, desc, brOpts))
275281
algorithms[desc.Digest.Algorithm().String()] = struct{}{}
276282
return nil, nil
@@ -428,6 +434,9 @@ func manifestsRecord(ctx context.Context, store content.Provider, manifests map[
428434
}
429435

430436
dgst := manifest.Config.Digest
437+
if err := dgst.Validate(); err != nil {
438+
return tarRecord{}, err
439+
}
431440
mfsts[i].Config = path.Join("blobs", dgst.Algorithm().String(), dgst.Encoded())
432441
for _, l := range manifest.Layers {
433442
path := path.Join("blobs", l.Digest.Algorithm().String(), l.Digest.Encoded())

images/archive/importer.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,9 @@ func resolveLayers(ctx context.Context, store content.Store, layerFiles []string
300300
}
301301
if s.GetCompression() == compression.Uncompressed {
302302
if compress {
303+
if err := desc.Digest.Validate(); err != nil {
304+
return nil, err
305+
}
303306
ref := fmt.Sprintf("compress-blob-%s-%s", desc.Digest.Algorithm().String(), desc.Digest.Encoded())
304307
labels := map[string]string{
305308
"containerd.io/uncompressed": desc.Digest.String(),

0 commit comments

Comments
 (0)