From 8dadbe76ff8c20d0e509406f04b7eade43baa6c1 Mon Sep 17 00:00:00 2001 From: Jon Johnson Date: Mon, 29 Jan 2024 11:24:28 -0800 Subject: [PATCH] Work around docker v25 tarballs (#1872) Previously, we'd only seen compressed layers have LayerSources. As of v25, docker puts all layers in here, uncompressed, which exposed a bug in how Descriptor interacts with partial's uncompressed layer handling. Signed-off-by: Jon Johnson --- pkg/v1/tarball/image.go | 33 +++++++++++++------- pkg/v1/tarball/image_test.go | 10 ++++++ pkg/v1/tarball/testdata/hello-world-v25.tar | Bin 0 -> 20480 bytes 3 files changed, 32 insertions(+), 11 deletions(-) create mode 100644 pkg/v1/tarball/testdata/hello-world-v25.tar diff --git a/pkg/v1/tarball/image.go b/pkg/v1/tarball/image.go index c984f3c8f..aba609dea 100644 --- a/pkg/v1/tarball/image.go +++ b/pkg/v1/tarball/image.go @@ -299,18 +299,29 @@ func (i *uncompressedImage) LayerByDiffID(h v1.Hash) (partial.UncompressedLayer, // v1.Layer doesn't force consumers to care about whether the layer is compressed // we should be fine returning the DockerLayer media type mt := types.DockerLayer - if bd, ok := i.imgDescriptor.LayerSources[h]; ok { - // Overwrite the mediaType for foreign layers. - return &foreignUncompressedLayer{ - uncompressedLayerFromTarball: uncompressedLayerFromTarball{ - diffID: diffID, - mediaType: bd.MediaType, - opener: i.opener, - filePath: i.imgDescriptor.Layers[idx], - }, - desc: bd, - }, nil + bd, ok := i.imgDescriptor.LayerSources[h] + if ok { + // This is janky, but we don't want to implement Descriptor for + // uncompressed layers because it breaks a bunch of assumptions in partial. + // See https://github.com/google/go-containerregistry/issues/1870 + docker25workaround := bd.MediaType == types.DockerUncompressedLayer || bd.MediaType == types.OCIUncompressedLayer + + if !docker25workaround { + // Overwrite the mediaType for foreign layers. + return &foreignUncompressedLayer{ + uncompressedLayerFromTarball: uncompressedLayerFromTarball{ + diffID: diffID, + mediaType: bd.MediaType, + opener: i.opener, + filePath: i.imgDescriptor.Layers[idx], + }, + desc: bd, + }, nil + } + + // Intentional fall through. } + return &uncompressedLayerFromTarball{ diffID: diffID, mediaType: mt, diff --git a/pkg/v1/tarball/image_test.go b/pkg/v1/tarball/image_test.go index 3a46400e4..7b1653914 100644 --- a/pkg/v1/tarball/image_test.go +++ b/pkg/v1/tarball/image_test.go @@ -70,6 +70,16 @@ func TestBundleSingle(t *testing.T) { } } +func TestDocker25(t *testing.T) { + img, err := ImageFromPath("testdata/hello-world-v25.tar", nil) + if err != nil { + t.Fatal(err) + } + if err := validate.Image(img); err != nil { + t.Fatal(err) + } +} + func TestBundleMultiple(t *testing.T) { for _, imgName := range []string{ "test_image_1", diff --git a/pkg/v1/tarball/testdata/hello-world-v25.tar b/pkg/v1/tarball/testdata/hello-world-v25.tar new file mode 100644 index 0000000000000000000000000000000000000000..4fd68388e00109a4fddec5eba4c0d3183bbc8f16 GIT binary patch literal 20480 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 NC|RInfnQ4t{4a#F%YXm? literal 0 HcmV?d00001