diff --git a/image/config.go b/image/config.go index 857f6c82e..097c2c7b5 100644 --- a/image/config.go +++ b/image/config.go @@ -51,7 +51,7 @@ type config struct { func findConfig(w walker, d *descriptor) (*config, error) { var c config - cpath := filepath.Join("blobs", d.normalizeDigest()) + cpath := filepath.Join("blobs", d.algo(), d.hash()) switch err := w.walk(func(path string, info os.FileInfo, r io.Reader) error { if info.IsDir() || filepath.Clean(path) != cpath { diff --git a/image/descriptor.go b/image/descriptor.go index d1e5d601f..106ab7fd9 100644 --- a/image/descriptor.go +++ b/image/descriptor.go @@ -33,8 +33,20 @@ type descriptor struct { Size int64 `json:"size"` } -func (d *descriptor) normalizeDigest() string { - return strings.Replace(d.Digest, ":", "-", -1) +func (d *descriptor) algo() string { + pts := strings.SplitN(d.Digest, ":", 2) + if len(pts) != 2 { + return "" + } + return pts[0] +} + +func (d *descriptor) hash() string { + pts := strings.SplitN(d.Digest, ":", 2) + if len(pts) != 2 { + return "" + } + return pts[1] } func findDescriptor(w walker, name string) (*descriptor, error) { @@ -67,8 +79,8 @@ func (d *descriptor) validate(w walker) error { return nil } - digest, err := filepath.Rel("blobs", filepath.Clean(path)) - if err != nil || d.normalizeDigest() != digest { + filename, err := filepath.Rel(filepath.Join("blobs", d.algo()), filepath.Clean(path)) + if err != nil || d.hash() != filename { return nil } @@ -78,11 +90,11 @@ func (d *descriptor) validate(w walker) error { return errEOW }); err { case nil: - return fmt.Errorf("%s: not found", d.normalizeDigest()) + return fmt.Errorf("%s: not found", d.Digest) case errEOW: return nil default: - return errors.Wrapf(err, "%s: validation failed", d.normalizeDigest()) + return errors.Wrapf(err, "%s: validation failed", d.Digest) } } diff --git a/image/manifest.go b/image/manifest.go index 227b24a03..c37b0957c 100644 --- a/image/manifest.go +++ b/image/manifest.go @@ -38,7 +38,7 @@ type manifest struct { func findManifest(w walker, d *descriptor) (*manifest, error) { var m manifest - mpath := filepath.Join("blobs", d.normalizeDigest()) + mpath := filepath.Join("blobs", d.algo(), d.hash()) switch err := w.walk(func(path string, info os.FileInfo, r io.Reader) error { if info.IsDir() || filepath.Clean(path) != mpath { @@ -98,8 +98,8 @@ func (m *manifest) unpack(w walker, dest string) error { return nil } - dd, err := filepath.Rel("blobs", filepath.Clean(path)) - if err != nil || d.normalizeDigest() != dd { + dd, err := filepath.Rel(filepath.Join("blobs", d.algo()), filepath.Clean(path)) + if err != nil || d.hash() != dd { return nil }