From 3ba4c511f44fbd46c4850803e33a5a560da717e6 Mon Sep 17 00:00:00 2001 From: ondrej-smola Date: Fri, 22 Jul 2022 22:49:23 +0200 Subject: [PATCH] Fix tar PAX format handling (#1414) * fix tar PAX handling on Windows * always force PAX format --- pkg/v1/mutate/mutate.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/pkg/v1/mutate/mutate.go b/pkg/v1/mutate/mutate.go index 7a1f59fed..6bae22493 100644 --- a/pkg/v1/mutate/mutate.go +++ b/pkg/v1/mutate/mutate.go @@ -244,6 +244,7 @@ func extract(img v1.Image, w io.Writer) error { if err != nil { return fmt.Errorf("retrieving image layers: %w", err) } + // we iterate through the layers in reverse order because it makes handling // whiteout layers more efficient, since we can just keep track of the removed // files as we see .wh. layers and ignore those in previous layers. @@ -267,6 +268,10 @@ func extract(img v1.Image, w io.Writer) error { // Some tools prepend everything with "./", so if we don't Clean the // name, we may have duplicate entries, which angers tar-split. header.Name = filepath.Clean(header.Name) + // force PAX format to remove Name/Linkname length limit of 100 characters + // required by USTAR and to not depend on internal tar package guess which + // prefers USTAR over PAX + header.Format = tar.FormatPAX basename := filepath.Base(header.Name) dirname := filepath.Dir(header.Name) @@ -297,7 +302,9 @@ func extract(img v1.Image, w io.Writer) error { // any entries with a matching (or child) name fileMap[name] = tombstone || !(header.Typeflag == tar.TypeDir) if !tombstone { - tarWriter.WriteHeader(header) + if err := tarWriter.WriteHeader(header); err != nil { + return err + } if header.Size > 0 { if _, err := io.CopyN(tarWriter, tarReader, header.Size); err != nil { return err