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 <mbuevans@gmail.com>
pull/31250/head
Evans Mungai 3 weeks ago
parent 78cf5470d1
commit 20054e6b56
No known key found for this signature in database
GPG Key ID: BBEB812143DD14E1

@ -36,6 +36,7 @@ import (
"fmt" "fmt"
"io" "io"
"io/fs" "io/fs"
"log/slog"
"os" "os"
"path/filepath" "path/filepath"
"runtime" "runtime"
@ -173,6 +174,13 @@ func CopyFile(src, dst string) (err error) {
} else { } else {
return nil 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) in, err := os.Open(src)

@ -35,6 +35,7 @@ import (
"os" "os"
"path/filepath" "path/filepath"
"runtime" "runtime"
"syscall"
"testing" "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) { func TestIsSymlink(t *testing.T) {
var currentUID = os.Getuid() var currentUID = os.Getuid()

Loading…
Cancel
Save