Skip to content

Commit c940c88

Browse files
committed
more robust handling of manifest structure
1 parent 2cb7788 commit c940c88

1 file changed

Lines changed: 28 additions & 19 deletions

File tree

pkg/store/store.go

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,10 @@ func (l *Layout) CleanUp(ctx context.Context) (int, int64, error) {
281281

282282
// walk through remaining artifacts and collect digests
283283
if err := l.OCI.Walk(func(reference string, desc ocispec.Descriptor) error {
284+
if desc.Digest.Validate() != nil {
285+
return nil
286+
}
287+
284288
// mark digest as referenced by existing artifact
285289
referencedDigests[desc.Digest.Hex()] = true
286290

@@ -291,32 +295,37 @@ func (l *Layout) CleanUp(ctx context.Context) (int, int64, error) {
291295
}
292296
defer rc.Close()
293297

294-
var head struct {
295-
MediaType string `json:"mediaType"`
298+
var manifest struct {
299+
Config struct {
300+
Digest digest.Digest `json:"digest"`
301+
}
302+
Layers []struct {
303+
digest.Digest `json:"digest"`
304+
} `json:"layers"`
305+
Manifests []struct {
306+
Digest digest.Digest `json:"digest"`
307+
} `json:"manifests"`
296308
}
297309

298-
if err := json.NewDecoder(rc).Decode(&head); err != nil {
310+
if err := json.NewDecoder(rc).Decode(&manifest); err != nil {
299311
return nil
300312
}
301-
if seeker, ok := rc.(io.Seeker); ok {
302-
_, _ = seeker.Seek(0, io.SeekStart)
313+
314+
// handle image manifest
315+
if manifest.Config.Digest.Validate() == nil {
316+
referencedDigests[manifest.Config.Digest.Hex()] = true
303317
}
304318

305-
switch head.MediaType {
306-
case ocispec.MediaTypeImageIndex:
307-
var index ocispec.Index
308-
if err := json.NewDecoder(rc).Decode(&index); err == nil {
309-
for _, m := range index.Manifests {
310-
referencedDigests[m.Digest.Hex()] = true
311-
}
319+
for _, layer := range manifest.Layers {
320+
if layer.Digest.Validate() == nil {
321+
referencedDigests[layer.Digest.Hex()] = true
312322
}
313-
default:
314-
var manifest ocispec.Manifest
315-
if err := json.NewDecoder(rc).Decode(&manifest); err == nil {
316-
referencedDigests[manifest.Config.Digest.Hex()] = true
317-
for _, layer := range manifest.Layers {
318-
referencedDigests[layer.Digest.Hex()] = true
319-
}
323+
}
324+
325+
// handle index list (manifests array)
326+
for _, m := range manifest.Manifests {
327+
if m.Digest.Validate() == nil {
328+
referencedDigests[m.Digest.Hex()] = true
320329
}
321330
}
322331

0 commit comments

Comments
 (0)