From c191a8c45675827d16503b5d13697710f0764508 Mon Sep 17 00:00:00 2001 From: Evans Mungai Date: Fri, 5 Sep 2025 18:49:40 +0100 Subject: [PATCH] fix: ignore irregular files in copyFile Signed-off-by: Evans Mungai --- internal/third_party/dep/fs/fs.go | 6 ++++ internal/third_party/dep/fs/fs_test.go | 43 ++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/internal/third_party/dep/fs/fs.go b/internal/third_party/dep/fs/fs.go index d29bb5f87..5110d2ea5 100644 --- a/internal/third_party/dep/fs/fs.go +++ b/internal/third_party/dep/fs/fs.go @@ -168,6 +168,12 @@ func copyFile(src, dst string) (err error) { } else { return nil } + } else { + if fi, err := os.Lstat(src); err != nil { + return errors.Wrap(err, "stat failed") + } else if !fi.Mode().IsRegular() { + return nil + } } in, err := os.Open(src) diff --git a/internal/third_party/dep/fs/fs_test.go b/internal/third_party/dep/fs/fs_test.go index d42c3f110..c33a49018 100644 --- a/internal/third_party/dep/fs/fs_test.go +++ b/internal/third_party/dep/fs/fs_test.go @@ -37,6 +37,7 @@ import ( "path/filepath" "runtime" "sync" + "syscall" "testing" ) @@ -560,6 +561,48 @@ func TestIsDir(t *testing.T) { } } +func TestCopyFileSkipIrregularFiles(t *testing.T) { + dir := t.TempDir() + + // Create a regular file first + regularFile := filepath.Join(dir, "regular.txt") + if err := os.WriteFile(regularFile, []byte("regular file content"), 0644); err != nil { + t.Fatal(err) + } + + // Test copying a regular file - should succeed + dstRegular := filepath.Join(dir, "regular_copy.txt") + if err := copyFile(regularFile, dstRegular); err != nil { + t.Fatalf("expected CopyFile to succeed for regular file, got error: %v", err) + } + + // Verify the regular file was copied + if _, err := os.Stat(dstRegular); err != nil { + t.Fatalf("expected regular file to be copied, but destination doesn't exist: %v", err) + } + + // Create a named pipe (FIFO) - this is an irregular file + // Note: syscall.Mkfifo is not available on Windows, so we skip this test there + pipeFile := filepath.Join(dir, "pipe") + if err := syscall.Mkfifo(pipeFile, 0644); err != nil { + if runtime.GOOS == "windows" { + t.Skip("skipping on windows - syscall.Mkfifo not available") + } + t.Fatal(err) + } + + // Test copying the named pipe - should skip without error + dstPipe := filepath.Join(dir, "pipe_copy") + if err := copyFile(pipeFile, dstPipe); err != nil { + t.Fatalf("expected CopyFile to skip irregular file without error, got error: %v", err) + } + + // Verify the irregular file was NOT copied (destination should not exist) + if _, err := os.Stat(dstPipe); err == nil { + t.Fatalf("expected irregular file to be skipped, but destination exists") + } +} + func TestIsSymlink(t *testing.T) { var currentUID = os.Getuid()