Skip to content

Commit

Permalink
Use Lstat to identify non-regular files in filesystem source (#2628)
Browse files Browse the repository at this point in the history
* Use Lstat to identify non-regular files in filesystem source

* fix test
  • Loading branch information
dustin-decker committed Mar 26, 2024
1 parent cb58250 commit 612ff1a
Showing 1 changed file with 11 additions and 7 deletions.
18 changes: 11 additions & 7 deletions pkg/sources/filesystem/filesystem.go
Original file line number Diff line number Diff line change
Expand Up @@ -93,12 +93,17 @@ func (s *Source) Chunks(ctx context.Context, chunksChan chan *sources.Chunk, _ .
s.SetProgressComplete(i, len(s.paths), fmt.Sprintf("Path: %s", path), "")

cleanPath := filepath.Clean(path)
fileInfo, err := os.Stat(cleanPath)
fileInfo, err := os.Lstat(cleanPath)
if err != nil {
logger.Error(err, "unable to get file info")
continue
}

if fileInfo.Mode()&os.ModeSymlink != 0 {
logger.Info("skipping, not a regular file", "path", cleanPath)
continue
}

if fileInfo.IsDir() {
err = s.scanDir(ctx, cleanPath, chunksChan)
} else {
Expand All @@ -112,7 +117,6 @@ func (s *Source) Chunks(ctx context.Context, chunksChan chan *sources.Chunk, _ .

return nil
}

func (s *Source) scanDir(ctx context.Context, path string, chunksChan chan *sources.Chunk) error {
workerPool := new(errgroup.Group)
workerPool.SetLimit(s.concurrency)
Expand Down Expand Up @@ -148,12 +152,12 @@ func (s *Source) scanDir(ctx context.Context, path string, chunksChan chan *sour

func (s *Source) scanFile(ctx context.Context, path string, chunksChan chan *sources.Chunk) error {
logger := ctx.Logger().WithValues("path", path)
fileStat, err := os.Stat(path)
fileStat, err := os.Lstat(path)
if err != nil {
return fmt.Errorf("unable to stat file: %w", err)
}
if !fileStat.Mode().IsRegular() {
return fmt.Errorf("not a regular file")
if fileStat.Mode()&os.ModeSymlink != 0 {
return fmt.Errorf("skipping symlink")
}

inputFile, err := os.Open(path)
Expand Down Expand Up @@ -231,7 +235,7 @@ func (s *Source) scanFile(ctx context.Context, path string, chunksChan chan *sou
// filepath or a directory.
func (s *Source) Enumerate(ctx context.Context, reporter sources.UnitReporter) error {
for _, path := range s.paths {
fileInfo, err := os.Stat(filepath.Clean(path))
fileInfo, err := os.Lstat(filepath.Clean(path))
if err != nil {
if err := reporter.UnitErr(ctx, err); err != nil {
return err
Expand Down Expand Up @@ -274,7 +278,7 @@ func (s *Source) ChunkUnit(ctx context.Context, unit sources.SourceUnit, reporte
logger := ctx.Logger().WithValues("path", path)

cleanPath := filepath.Clean(path)
fileInfo, err := os.Stat(cleanPath)
fileInfo, err := os.Lstat(cleanPath)
if err != nil {
return reporter.ChunkErr(ctx, fmt.Errorf("unable to get file info: %w", err))
}
Expand Down

0 comments on commit 612ff1a

Please sign in to comment.