From 6d0ee326d86e54ca99278e175c8c7753c0c55e8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Galv=C3=A3o=20Xavier?= Date: Thu, 4 Nov 2021 11:24:05 -0700 Subject: [PATCH] ignore irregular files while indexing directory (#616) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * stop hidding command from help doc Signed-off-by: Jonas Galvão Xavier * do not index irregular files Signed-off-by: Jonas Galvão Xavier * fix fixture dir and err name Signed-off-by: Jonas Galvão Xavier * improve the description of irregular files Signed-off-by: Jonas Galvão Xavier * explicitly check indexed file name Signed-off-by: Jonas Galvão Xavier --- syft/source/directory_resolver.go | 6 +++- syft/source/directory_resolver_test.go | 29 +++++++++++++++++++ syft/source/file_type.go | 6 ++++ .../test-fixtures/irregular-files/readme | 2 ++ 4 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 syft/source/test-fixtures/irregular-files/readme diff --git a/syft/source/directory_resolver.go b/syft/source/directory_resolver.go index e5ef80aad..594f66ba7 100644 --- a/syft/source/directory_resolver.go +++ b/syft/source/directory_resolver.go @@ -25,6 +25,8 @@ var unixSystemRuntimePrefixes = []string{ "/dev", } +var ErrIgnoreIrregularFile = errors.New("ignoring irregular file type") + var _ FileResolver = (*directoryResolver)(nil) type pathFilterFn func(string) bool @@ -137,7 +139,7 @@ func (r *directoryResolver) indexPath(path string, info os.FileInfo, err error) } func (r *directoryResolver) handleFileAccessErr(path string, err error) error { - if errors.Is(err, os.ErrPermission) || errors.Is(err, os.ErrNotExist) { + if errors.Is(err, os.ErrPermission) || errors.Is(err, os.ErrNotExist) || errors.Is(err, ErrIgnoreIrregularFile) { // don't allow for permission errors to stop indexing, keep track of the paths and continue. log.Warnf("unable to access path=%q: %+v", path, err) r.errPaths[path] = err @@ -176,6 +178,8 @@ func (r directoryResolver) addPathToIndex(p string, info os.FileInfo) (string, e if err != nil { return "", err } + case IrregularFile: + return "", ErrIgnoreIrregularFile default: ref, err = r.fileTree.AddFile(file.Path(p)) if err != nil { diff --git a/syft/source/directory_resolver_test.go b/syft/source/directory_resolver_test.go index df6a237b9..a2cc3fab7 100644 --- a/syft/source/directory_resolver_test.go +++ b/syft/source/directory_resolver_test.go @@ -1,10 +1,13 @@ package source import ( + "io/ioutil" "os" "path" + "path/filepath" "reflect" "strings" + "syscall" "testing" "github.com/scylladb/go-set/strset" @@ -459,3 +462,29 @@ func Test_directoryResolver_FilesByMIMEType(t *testing.T) { }) } } + +func Test_ignoreIrregularFiles(t *testing.T) { + // NOTE: craeting a pipe/fifo file on demand since git doesn't let me + // commit one. The directory resolver should ignore it (and any other + // file that is neither regular, a symlink or directory) when indexing a directory + dir := "./test-fixtures/irregular-files" + f := "f.fifo" + + err := syscall.Mknod(filepath.Join(dir, f), syscall.S_IFIFO|0666, 0) + assert.NoError(t, err) + defer func() { + err := os.Remove(filepath.Join(dir, f)) + assert.NoError(t, err) + }() + + fileRefs, err := ioutil.ReadDir(dir) + assert.NoError(t, err) + assert.Len(t, fileRefs, 2) // two files (f.fifo and readme) + + resolver, err := newDirectoryResolver(dir) + assert.NoError(t, err) + + assert.Len(t, resolver.fileTree.AllFiles(), 1) + rp := resolver.fileTree.AllFiles()[0].RealPath + assert.True(t, strings.Contains(string(rp), filepath.Join(dir, "readme"))) +} diff --git a/syft/source/file_type.go b/syft/source/file_type.go index d4cd5abdc..4e5268fe5 100644 --- a/syft/source/file_type.go +++ b/syft/source/file_type.go @@ -8,6 +8,10 @@ import ( const ( UnknownFileType FileType = "UnknownFileType" RegularFile FileType = "RegularFile" + // IrregularFile is how syft defines files that are neither regular, symbolic or directory. + // For ref: the seven standard Unix file types are regular, directory, symbolic link, + // FIFO special, block special, character special, and socket as defined by POSIX. + IrregularFile FileType = "IrregularFile" HardLink FileType = "HardLink" SymbolicLink FileType = "SymbolicLink" CharacterDevice FileType = "CharacterDevice" @@ -45,6 +49,8 @@ func newFileTypeFromMode(mode os.FileMode) FileType { return SymbolicLink case mode.IsDir(): return Directory + case !mode.IsRegular(): + return IrregularFile default: return RegularFile } diff --git a/syft/source/test-fixtures/irregular-files/readme b/syft/source/test-fixtures/irregular-files/readme new file mode 100644 index 000000000..df85b76ad --- /dev/null +++ b/syft/source/test-fixtures/irregular-files/readme @@ -0,0 +1,2 @@ +this directory exists for unit tests on irregular files. You can't see other files here because they are removed after each test. +This readme is a better version of Russell's teapot.