@@ -22,6 +22,7 @@ import (
2222 "context"
2323 "fmt"
2424 "io"
25+ "io/fs"
2526 "os"
2627 "path/filepath"
2728 "reflect"
@@ -601,15 +602,13 @@ var _ = Describe("Hash methods", func() {
601602})
602603
603604func createTarGz (dest string ) {
604- // Create the test directory and some test files.
605- err := os .MkdirAll ("testdata/testdir" , 0755 )
606- Expect (err ).To (BeNil ())
607- err = os .WriteFile ("testdata/test.txt" , []byte ("This is a test file." ), 0600 )
608- Expect (err ).To (BeNil ())
609- err = os .WriteFile ("testdata/testdir/test.txt" , []byte ("This is another test file." ), 0600 )
610- Expect (err ).To (BeNil ())
605+ baseDir := "testdata"
606+ // Create the test directory and files
607+ Expect (os .MkdirAll (filepath .Join (baseDir , "testdir" ), 0755 )).To (Succeed ())
608+ Expect (os .WriteFile (filepath .Join (baseDir , "test.txt" ), []byte ("This is a test file." ), 0600 )).To (Succeed ())
609+ Expect (os .WriteFile (filepath .Join (baseDir , "testdir" , "test.txt" ), []byte ("This is another test file." ), 0600 )).To (Succeed ())
611610
612- // Create the testdata/test.tar.gz file.
611+ // Create the destination archive
613612 file , err := os .Create (dest )
614613 Expect (err ).To (BeNil ())
615614 defer file .Close ()
@@ -620,28 +619,53 @@ func createTarGz(dest string) {
620619 tarWriter := tar .NewWriter (gzWriter )
621620 defer tarWriter .Close ()
622621
623- err = filepath .Walk ("testdata/" , func (path string , info os.FileInfo , err error ) error {
622+ // 1. Open the root of the walking operation
623+ root , err := os .OpenRoot (baseDir )
624+ Expect (err ).To (BeNil ())
625+ defer root .Close ()
626+
627+ // 2. Use WalkDir (more efficient than Walk)
628+ err = filepath .WalkDir (baseDir , func (path string , d fs.DirEntry , err error ) error {
629+ if err != nil {
630+ return err
631+ }
632+
633+ // Get info for the tar header
634+ info , err := d .Info ()
624635 if err != nil {
625636 return err
626637 }
638+
627639 header , err := tar .FileInfoHeader (info , "" )
628640 if err != nil {
629641 return err
630642 }
631- header .Name = path [len ("testdata" )+ 1 :]
643+
644+ // Clean up the path for the tar header
645+ rel , _ := filepath .Rel (baseDir , path )
646+ header .Name = rel
647+ if rel == "." {
648+ return nil
649+ } // Skip the root directory itself if needed
650+
632651 err = tarWriter .WriteHeader (header )
633652 if err != nil {
634653 return err
635654 }
655+
636656 if ! info .Mode ().IsRegular () {
637657 return nil
638658 }
639- file , err := os .Open (path )
659+
660+ // 3. SECURE FIX: Open file relative to the root handle
661+ // This prevents G122 by ensuring no symlinks escaped 'testdata'
662+ f , err := root .Open (rel )
640663 if err != nil {
641664 return err
642665 }
643- defer file .Close ()
644- _ , err = io .Copy (tarWriter , file )
666+ defer f .Close ()
667+
668+ _ , err = io .Copy (tarWriter , f )
645669 return err
646670 })
647671 Expect (err ).To (BeNil ())
0 commit comments