@@ -243,6 +243,11 @@ func TestBreakouts(t *testing.T) {
243243 return nil
244244 }
245245 errFileDiff := errors .New ("files differ" )
246+ td , err := ioutil .TempDir ("" , "test-breakouts-" )
247+ if err != nil {
248+ t .Fatal (err )
249+ }
250+ defer os .RemoveAll (td )
246251
247252 isSymlinkFile := func (f string ) func (string ) error {
248253 return func (root string ) error {
@@ -744,6 +749,36 @@ func TestBreakouts(t *testing.T) {
744749 // resolution ends up just removing etc
745750 validator : fileNotExists ("etc/passwd" ),
746751 },
752+ {
753+
754+ name : "HardlinkSymlinkChmod" ,
755+ w : func () tartest.WriterToTar {
756+ p := filepath .Join (td , "perm400" )
757+ if err := ioutil .WriteFile (p , []byte ("..." ), 0400 ); err != nil {
758+ t .Fatal (err )
759+ }
760+ ep := filepath .Join (td , "also-exists-outside-root" )
761+ if err := ioutil .WriteFile (ep , []byte ("..." ), 0640 ); err != nil {
762+ t .Fatal (err )
763+ }
764+
765+ return tartest .TarAll (
766+ tc .Symlink (p , ep ),
767+ tc .Link (ep , "sketchylink" ),
768+ )
769+ }(),
770+ validator : func (string ) error {
771+ p := filepath .Join (td , "perm400" )
772+ fi , err := os .Lstat (p )
773+ if err != nil {
774+ return err
775+ }
776+ if perm := fi .Mode () & os .ModePerm ; perm != 0400 {
777+ return errors .Errorf ("%s perm changed from 0400 to %04o" , p , perm )
778+ }
779+ return nil
780+ },
781+ },
747782 }
748783
749784 for _ , bo := range breakouts {
0 commit comments