|
1 | | -//go:build !windows && !darwin |
| 1 | +//go:build !windows |
2 | 2 |
|
3 | 3 | /* |
4 | 4 | Copyright The containerd Authors. |
@@ -28,6 +28,7 @@ import ( |
28 | 28 | "io" |
29 | 29 | "os" |
30 | 30 | "path/filepath" |
| 31 | + "runtime" |
31 | 32 | "testing" |
32 | 33 | "time" |
33 | 34 |
|
@@ -359,13 +360,14 @@ func TestBreakouts(t *testing.T) { |
359 | 360 | } |
360 | 361 | } |
361 | 362 |
|
362 | | - breakouts := []struct { |
| 363 | + type breakoutTest struct { |
363 | 364 | name string |
364 | 365 | w tartest.WriterToTar |
365 | 366 | apply fstest.Applier |
366 | 367 | validator func(string) error |
367 | 368 | err error |
368 | | - }{ |
| 369 | + } |
| 370 | + breakouts := []breakoutTest{ |
369 | 371 | { |
370 | 372 | name: "SymlinkAbsolute", |
371 | 373 | w: tartest.TarAll( |
@@ -497,42 +499,7 @@ func TestBreakouts(t *testing.T) { |
497 | 499 | ), |
498 | 500 | validator: sameFile("localpasswd", "/etc/passwd"), |
499 | 501 | }, |
500 | | - { |
501 | | - name: "HardlinkSymlinkBeforeCreateTarget", |
502 | | - w: tartest.TarAll( |
503 | | - tc.Dir("etc", 0770), |
504 | | - tc.Symlink("/etc/passwd", "localpasswd"), |
505 | | - tc.Link("localpasswd", "localpasswd-dup"), |
506 | | - tc.File("/etc/passwd", []byte("after"), 0644), |
507 | | - ), |
508 | | - validator: sameFile("localpasswd-dup", "/etc/passwd"), |
509 | | - }, |
510 | | - { |
511 | | - name: "HardlinkSymlinkRelative", |
512 | | - w: tartest.TarAll( |
513 | | - tc.Dir("etc", 0770), |
514 | | - tc.File("/etc/passwd", []byte("inside"), 0644), |
515 | | - tc.Symlink("../../../../../etc/passwd", "passwdlink"), |
516 | | - tc.Link("/passwdlink", "localpasswd"), |
517 | | - ), |
518 | | - validator: all( |
519 | | - sameSymlinkFile("/localpasswd", "/passwdlink"), |
520 | | - sameFile("/localpasswd", "/etc/passwd"), |
521 | | - ), |
522 | | - }, |
523 | | - { |
524 | | - name: "HardlinkSymlinkAbsolute", |
525 | | - w: tartest.TarAll( |
526 | | - tc.Dir("etc", 0770), |
527 | | - tc.File("/etc/passwd", []byte("inside"), 0644), |
528 | | - tc.Symlink("/etc/passwd", "passwdlink"), |
529 | | - tc.Link("/passwdlink", "localpasswd"), |
530 | | - ), |
531 | | - validator: all( |
532 | | - sameSymlinkFile("/localpasswd", "/passwdlink"), |
533 | | - sameFile("/localpasswd", "/etc/passwd"), |
534 | | - ), |
535 | | - }, |
| 502 | + |
536 | 503 | { |
537 | 504 | name: "SymlinkParentDirectory", |
538 | 505 | w: tartest.TarAll( |
@@ -745,36 +712,77 @@ func TestBreakouts(t *testing.T) { |
745 | 712 | // resolution ends up just removing etc |
746 | 713 | validator: fileNotExists("etc/passwd"), |
747 | 714 | }, |
748 | | - { |
749 | | - |
750 | | - name: "HardlinkSymlinkChmod", |
751 | | - w: func() tartest.WriterToTar { |
752 | | - p := filepath.Join(td, "perm400") |
753 | | - if err := os.WriteFile(p, []byte("..."), 0400); err != nil { |
754 | | - t.Fatal(err) |
755 | | - } |
756 | | - ep := filepath.Join(td, "also-exists-outside-root") |
757 | | - if err := os.WriteFile(ep, []byte("..."), 0640); err != nil { |
758 | | - t.Fatal(err) |
759 | | - } |
| 715 | + } |
760 | 716 |
|
761 | | - return tartest.TarAll( |
762 | | - tc.Symlink(p, ep), |
763 | | - tc.Link(ep, "sketchylink"), |
764 | | - ) |
765 | | - }(), |
766 | | - validator: func(string) error { |
767 | | - p := filepath.Join(td, "perm400") |
768 | | - fi, err := os.Lstat(p) |
769 | | - if err != nil { |
770 | | - return err |
771 | | - } |
772 | | - if perm := fi.Mode() & os.ModePerm; perm != 0400 { |
773 | | - return fmt.Errorf("%s perm changed from 0400 to %04o", p, perm) |
774 | | - } |
775 | | - return nil |
| 717 | + // The follow tests perform operations not permitted on Darwin |
| 718 | + if runtime.GOOS != "darwin" { |
| 719 | + breakouts = append(breakouts, []breakoutTest{ |
| 720 | + { |
| 721 | + name: "HardlinkSymlinkBeforeCreateTarget", |
| 722 | + w: tartest.TarAll( |
| 723 | + tc.Dir("etc", 0770), |
| 724 | + tc.Symlink("/etc/passwd", "localpasswd"), |
| 725 | + tc.Link("localpasswd", "localpasswd-dup"), |
| 726 | + tc.File("/etc/passwd", []byte("after"), 0644), |
| 727 | + ), |
| 728 | + validator: sameFile("localpasswd-dup", "/etc/passwd"), |
776 | 729 | }, |
777 | | - }, |
| 730 | + { |
| 731 | + name: "HardlinkSymlinkRelative", |
| 732 | + w: tartest.TarAll( |
| 733 | + tc.Dir("etc", 0770), |
| 734 | + tc.File("/etc/passwd", []byte("inside"), 0644), |
| 735 | + tc.Symlink("../../../../../etc/passwd", "passwdlink"), |
| 736 | + tc.Link("/passwdlink", "localpasswd"), |
| 737 | + ), |
| 738 | + validator: all( |
| 739 | + sameSymlinkFile("/localpasswd", "/passwdlink"), |
| 740 | + sameFile("/localpasswd", "/etc/passwd"), |
| 741 | + ), |
| 742 | + }, |
| 743 | + { |
| 744 | + name: "HardlinkSymlinkAbsolute", |
| 745 | + w: tartest.TarAll( |
| 746 | + tc.Dir("etc", 0770), |
| 747 | + tc.File("/etc/passwd", []byte("inside"), 0644), |
| 748 | + tc.Symlink("/etc/passwd", "passwdlink"), |
| 749 | + tc.Link("/passwdlink", "localpasswd"), |
| 750 | + ), |
| 751 | + validator: all( |
| 752 | + sameSymlinkFile("/localpasswd", "/passwdlink"), |
| 753 | + sameFile("/localpasswd", "/etc/passwd"), |
| 754 | + ), |
| 755 | + }, |
| 756 | + { |
| 757 | + name: "HardlinkSymlinkChmod", |
| 758 | + w: func() tartest.WriterToTar { |
| 759 | + p := filepath.Join(td, "perm400") |
| 760 | + if err := os.WriteFile(p, []byte("..."), 0400); err != nil { |
| 761 | + t.Fatal(err) |
| 762 | + } |
| 763 | + ep := filepath.Join(td, "also-exists-outside-root") |
| 764 | + if err := os.WriteFile(ep, []byte("..."), 0640); err != nil { |
| 765 | + t.Fatal(err) |
| 766 | + } |
| 767 | + |
| 768 | + return tartest.TarAll( |
| 769 | + tc.Symlink(p, ep), |
| 770 | + tc.Link(ep, "sketchylink"), |
| 771 | + ) |
| 772 | + }(), |
| 773 | + validator: func(string) error { |
| 774 | + p := filepath.Join(td, "perm400") |
| 775 | + fi, err := os.Lstat(p) |
| 776 | + if err != nil { |
| 777 | + return err |
| 778 | + } |
| 779 | + if perm := fi.Mode() & os.ModePerm; perm != 0400 { |
| 780 | + return fmt.Errorf("%s perm changed from 0400 to %04o", p, perm) |
| 781 | + } |
| 782 | + return nil |
| 783 | + }, |
| 784 | + }, |
| 785 | + }...) |
778 | 786 | } |
779 | 787 |
|
780 | 788 | for _, bo := range breakouts { |
|
0 commit comments