diff --git a/distribution/pull_v2.go b/distribution/pull_v2.go index 871a0aee70ddb..5883de95660a3 100644 --- a/distribution/pull_v2.go +++ b/distribution/pull_v2.go @@ -620,14 +620,12 @@ func (p *v2Puller) pullSchema1(ctx context.Context, ref reference.Reference, unv } func checkSupportedMediaType(mediaType string) error { - supportedMediaTypes := []string{ - "application/vnd.oci.image.", - "application/vnd.docker.", - } - lowerMt := strings.ToLower(mediaType) for _, mt := range supportedMediaTypes { - if strings.HasPrefix(lowerMt, mt) { + // The should either be an exact match, or have a valid prefix + // we append a "." when matching prefixes to exclude "false positives"; + // for example, we don't want to match "application/vnd.oci.images_are_fun_yolo". + if lowerMt == mt || strings.HasPrefix(lowerMt, mt+".") { return nil } } diff --git a/distribution/registry.go b/distribution/registry.go index 2e031847c063b..b6826a6cbf70d 100644 --- a/distribution/registry.go +++ b/distribution/registry.go @@ -19,6 +19,22 @@ import ( ocispec "github.com/opencontainers/image-spec/specs-go/v1" ) +// supportedMediaTypes represents acceptable media-type(-prefixes) +// we use this list to prevent obscure errors when trying to pull +// OCI artifacts. +var supportedMediaTypes = []string{ + // valid prefixes + "application/vnd.oci.image", + "application/vnd.docker", + + // these types may occur on old images, and are copied from + // ImageTypes below. + "application/octet-stream", + "application/json", + "text/html", + "", +} + // ImageTypes represents the schema2 config types for images var ImageTypes = []string{ schema2.MediaTypeImageConfig,