Skip to content

Commit f879440

Browse files
fallback to docker format was not working as intended
1 parent 71d8d46 commit f879440

File tree

1 file changed

+53
-27
lines changed

1 file changed

+53
-27
lines changed

cmd/dmverity-vhd/main.go

Lines changed: 53 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -182,33 +182,8 @@ func isTar(reader io.Reader) (io.Reader, bool) {
182182
return io.MultiReader(&header, reader), err == nil || err == io.EOF
183183
}
184184

185-
func processLocalImage(imageReader io.Reader, onLayer LayerProcessor) (map[int]string, map[int]string, error) {
186-
imageFileReader := tar.NewReader(imageReader)
187-
files := make(map[string][]byte)
188-
185+
func processLocalOCIImage(files map[string][]byte, onLayer LayerProcessor) (map[int]string, map[int]string, error) {
189186
layerIDs := make(map[int]string)
190-
layerDigestCandidates := make(map[string]map[int]string)
191-
var configPath string
192-
193-
for {
194-
hdr, err := imageFileReader.Next()
195-
if errors.Is(err, io.EOF) {
196-
break
197-
}
198-
if err != nil {
199-
return nil, nil, err
200-
}
201-
202-
if hdr.Typeflag == tar.TypeReg {
203-
data, err := io.ReadAll(imageFileReader)
204-
if err != nil {
205-
return nil, nil, err
206-
}
207-
files[hdr.Name] = data
208-
}
209-
}
210-
211-
// OCI parsing first
212187
if indexData, ok := files["index.json"]; ok {
213188
log.Info("OCI image format detected (index.json found).")
214189
var index struct {
@@ -293,8 +268,14 @@ func processLocalImage(imageReader io.Reader, onLayer LayerProcessor) (map[int]s
293268
}
294269
return layerDigests, layerIDs, nil
295270
}
271+
return nil, nil, errors.New("not able to parse in OCI format")
272+
}
273+
274+
func processLocalDockerImage(files map[string][]byte, onLayer LayerProcessor) (map[int]string, map[int]string, error) {
275+
layerIDs := make(map[int]string)
276+
layerDigestCandidates := make(map[string]map[int]string)
277+
var configPath string
296278

297-
// Docker legacy fallback
298279
if manifestData, ok := files["manifest.json"]; ok {
299280
log.Info("Docker legacy image format detected (manifest.json found).")
300281
type Manifest []struct {
@@ -359,6 +340,51 @@ func processLocalImage(imageReader io.Reader, onLayer LayerProcessor) (map[int]s
359340

360341
return layerDigests, layerIDs, nil
361342
}
343+
return nil, nil, errors.New("not able to parse in Docker format")
344+
}
345+
346+
func processLocalImage(imageReader io.Reader, onLayer LayerProcessor) (map[int]string, map[int]string, error) {
347+
imageFileReader := tar.NewReader(imageReader)
348+
files := make(map[string][]byte)
349+
350+
for {
351+
hdr, err := imageFileReader.Next()
352+
if errors.Is(err, io.EOF) {
353+
break
354+
}
355+
if err != nil {
356+
return nil, nil, err
357+
}
358+
359+
if hdr.Typeflag == tar.TypeReg {
360+
data, err := io.ReadAll(imageFileReader)
361+
if err != nil {
362+
return nil, nil, err
363+
}
364+
files[hdr.Name] = data
365+
}
366+
}
367+
368+
// OCI parsing first
369+
layerDigests, layerIDs, err := processLocalOCIImage(files, onLayer)
370+
// continue to parse if an error is reached
371+
if err != nil {
372+
log.Warnf("Errored while trying to parse OCI format: %v", err)
373+
}
374+
if len(layerDigests) > 0 && len(layerIDs) > 0 {
375+
return layerDigests, layerIDs, nil
376+
}
377+
378+
// Docker legacy fallback
379+
layerDigests, layerIDs, err = processLocalDockerImage(files, onLayer)
380+
// continue to parse if an error is reached
381+
if err != nil {
382+
log.Warnf("Errored while trying to parse Docker format: %v", err)
383+
}
384+
if len(layerDigests) > 0 && len(layerIDs) > 0 {
385+
return layerDigests, layerIDs, nil
386+
}
387+
362388

363389
log.Warn("No recognizable OCI or Docker manifest found in provided tarball.")
364390
return nil, nil, errors.New("no recognizable image format found")

0 commit comments

Comments
 (0)