@@ -655,12 +655,20 @@ func createTarFile(path, extractDir string, hdr *tar.Header, reader io.Reader, L
655
655
// so use hdrInfo.Mode() (they differ for e.g. setuid bits)
656
656
hdrInfo := hdr .FileInfo ()
657
657
658
+ typeFlag := hdr .Typeflag
658
659
mask := hdrInfo .Mode ()
660
+
661
+ // update also the implementation of ForceMask in pkg/chunked
659
662
if forceMask != nil {
660
663
mask = * forceMask
664
+ // If we have a forceMask, force the real type to either be a directory,
665
+ // a link, or a regular file.
666
+ if typeFlag != tar .TypeDir && typeFlag != tar .TypeSymlink && typeFlag != tar .TypeLink {
667
+ typeFlag = tar .TypeReg
668
+ }
661
669
}
662
670
663
- switch hdr . Typeflag {
671
+ switch typeFlag {
664
672
case tar .TypeDir :
665
673
// Create directory unless it exists as a directory already.
666
674
// In that case we just want to merge the two
@@ -728,16 +736,6 @@ func createTarFile(path, extractDir string, hdr *tar.Header, reader io.Reader, L
728
736
return fmt .Errorf ("unhandled tar header type %d" , hdr .Typeflag )
729
737
}
730
738
731
- if forceMask != nil && (hdr .Typeflag != tar .TypeSymlink || runtime .GOOS == "darwin" ) {
732
- value := idtools.Stat {
733
- IDs : idtools.IDPair {UID : hdr .Uid , GID : hdr .Gid },
734
- Mode : hdrInfo .Mode () & 0o7777 ,
735
- }
736
- if err := idtools .SetContainersOverrideXattr (path , value ); err != nil {
737
- return err
738
- }
739
- }
740
-
741
739
// Lchown is not supported on Windows.
742
740
if Lchown && runtime .GOOS != windows {
743
741
if chownOpts == nil {
@@ -807,6 +805,18 @@ func createTarFile(path, extractDir string, hdr *tar.Header, reader io.Reader, L
807
805
}
808
806
}
809
807
808
+ if forceMask != nil && (typeFlag == tar .TypeReg || typeFlag == tar .TypeDir || runtime .GOOS == "darwin" ) {
809
+ value := idtools.Stat {
810
+ IDs : idtools.IDPair {UID : hdr .Uid , GID : hdr .Gid },
811
+ Mode : hdrInfo .Mode (),
812
+ Major : int (hdr .Devmajor ),
813
+ Minor : int (hdr .Devminor ),
814
+ }
815
+ if err := idtools .SetContainersOverrideXattr (path , value ); err != nil {
816
+ return err
817
+ }
818
+ }
819
+
810
820
// We defer setting flags on directories until the end of
811
821
// Unpack or UnpackLayer in case setting them makes the
812
822
// directory immutable.
@@ -1149,11 +1159,11 @@ loop:
1149
1159
}
1150
1160
1151
1161
if options .ForceMask != nil {
1152
- value := idtools.Stat {Mode : 0o755 }
1162
+ value := idtools.Stat {Mode : os . ModeDir | os . FileMode ( 0o755 ) }
1153
1163
if rootHdr != nil {
1154
1164
value .IDs .UID = rootHdr .Uid
1155
1165
value .IDs .GID = rootHdr .Gid
1156
- value .Mode = os .FileMode (rootHdr .Mode )
1166
+ value .Mode = os .ModeDir | os . FileMode (rootHdr .Mode )
1157
1167
}
1158
1168
if err := idtools .SetContainersOverrideXattr (dest , value ); err != nil {
1159
1169
return err
@@ -1379,7 +1389,7 @@ func remapIDs(readIDMappings, writeIDMappings *idtools.IDMappings, chownOpts *id
1379
1389
uid , gid = hdr .Uid , hdr .Gid
1380
1390
if xstat , ok := hdr .PAXRecords [PaxSchilyXattr + idtools .ContainersOverrideXattr ]; ok {
1381
1391
attrs := strings .Split (string (xstat ), ":" )
1382
- if len (attrs ) = = 3 {
1392
+ if len (attrs ) > = 3 {
1383
1393
val , err := strconv .ParseUint (attrs [0 ], 10 , 32 )
1384
1394
if err != nil {
1385
1395
uid = int (val )
0 commit comments