From 20054e6b5693b26a669600af83636cbcf89adc4e Mon Sep 17 00:00:00 2001 From: Evans Mungai Date: Fri, 5 Sep 2025 11:09:56 +0100 Subject: [PATCH] fix: Ignore irregular files during copy Irregular files do not contain data and should not be copied. They are typically used for inter-process communication or other special purposes. Fixes: #31139 Signed-off-by: Evans Mungai --- internal/third_party/dep/fs/fs.go | 8 +++++ internal/third_party/dep/fs/fs_test.go | 43 ++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/internal/third_party/dep/fs/fs.go b/internal/third_party/dep/fs/fs.go index 6e2720f3b..c1e2f4292 100644 --- a/internal/third_party/dep/fs/fs.go +++ b/internal/third_party/dep/fs/fs.go @@ -36,6 +36,7 @@ import ( "fmt" "io" "io/fs" + "log/slog" "os" "path/filepath" "runtime" @@ -173,6 +174,13 @@ func CopyFile(src, dst string) (err error) { } else { return nil } + } else { + if fi, err := os.Lstat(src); err != nil { + return fmt.Errorf("stat failed: %w", err) + } else if !fi.Mode().IsRegular() { + slog.Debug("skipping non-regular file", "path", src, "mode", fi.Mode()) + 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 610771bc3..3f68db081 100644 --- a/internal/third_party/dep/fs/fs_test.go +++ b/internal/third_party/dep/fs/fs_test.go @@ -35,6 +35,7 @@ import ( "os" "path/filepath" "runtime" + "syscall" "testing" ) @@ -542,6 +543,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()