Skip to content

Check files symlink support#398

Open
inqrphl wants to merge 15 commits into
mainfrom
check-files-symlink-support
Open

Check files symlink support#398
inqrphl wants to merge 15 commits into
mainfrom
check-files-symlink-support

Conversation

@inqrphl

@inqrphl inqrphl commented Jun 30, 2026

Copy link
Copy Markdown
Contributor

default golang filepath.Walk did not traverse into the recursive directories. need to check if a filesystem item is a link using fs.readLink

add a new file walker, it can resolve file links, and keeps track of visited files, directories and inodes

this prevents infinite recursion and adding the same file twice due to hard links

add new argument followSymlinks and new attribute is_symlink.

This attribute is toggled on for symlinks and junctions under windows.

On windows, file walker sees hardlinks like another files, but cannot determine if they are hardlinks or not. So they are added without setting is_symlink on.

On windows, it can detect junctions by checking if FILE_ATTRIBUTE_REPARSE_POINT bit is set in the Win32 file attribute struct. This is on for symlinks and junctions.

On linux, it can detect hardlinks by checking visited inodes array. They are not added on linux.

added a new argument to the check called follow-symlinks, it is true by default.

added a new argument to check called add-files-only-once, this can be used to ensure that each file, determined by its absolute path, is added once. useful for the cases where there might be a recursion under the check path due to symlinks. it is false by default

if arguments are not specified, follow symlinks is on , add files only once is off , and max-depth is unlimited. this can lead to infinite recursion. If max-depth is not specifically set, follow symlinks is on, and add files only once is off, clamp the max-depth to a ceiling value, defaulted to 50

added a powershell/bash script to dynamically generate some files / links and check related functionality during testing.

Ahmet Oeztuerk added 2 commits June 30, 2026 10:09
add new argument followSymlinks and new attribute is_symlink

add a new file walker, it can resolve file links, and keeps track of visited directories to prevent infinite recursion
Add default value to the followSymlinks argument definition

Change is_symlink behavior: it is only toggled on if the file/directory itself is a symlink

change the unit of is_symlink to UBool, its filters can now parse bool values
@lgmu

lgmu commented Jun 30, 2026

Copy link
Copy Markdown
Contributor

symbolic links for linux and windows work, but junctions are not recognized yet

@inqrphl inqrphl marked this pull request as draft July 6, 2026 10:22
inqrphl and others added 7 commits July 6, 2026 16:17
…the resolved paths for tracking visited files/directories.

add a new test function for check_files, windows specific for now. uses script to generate symlinks, hardlinks and junctions
… detect hard links and skip over them

add bash script to generate filesystem links, and write linux/darwin test for them
… detection is toggleable

this argument is off by default. it is mean to prevent some problems when follow symlinks is true.

searched path might have two links pointing to the same file,  or a case with infinite recursion. with the argument, these files are not added again

if the follow-symlinks is true, and add-files-only-once is false, adjust the max-depth := max(max-depth, 50) . this prevents infinite recursion, but allows limited recursion which might be needed.

write a test for this case, windows only for now - checks if the infinite recursion is happenning according to add-files-only-once being true or false
in the default invocation, follow-symlinks is true, add-files-only-once
is false, and max-depth is -1 . due to first two, max-depth was being
set adjusted to prevent infinite loops, without checking if it was
manually specified to another value max-depth

now check if max-depth != -1 as well, meaning it was left default. only
then we adjust it

also define the default value of max-depth into a variable, makes the
code more understandable
@inqrphl inqrphl marked this pull request as ready for review July 9, 2026 14:25
Comment thread docs/checks/commands/check_files.md Outdated
Comment thread pkg/snclient/check_files.go Outdated
Comment thread pkg/snclient/check_files.go Outdated
@sni

sni commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

looks good besides the thing with the default recursion.

Ahmet Oeztuerk and others added 5 commits July 10, 2026 18:27
… recursion

default max-depth is now '-2' , and the max-depth enables unchecked recursion is -1

use it to check if max-depth is set or not. if its not set, follow symlinks is enabled, and files are not added only once, set the max depth to CheckFilesFollowSymlinkMaxDepth
CheckFilesDefaultMaxDepth is the default value for max-depth

CheckFilesMaxDepthUnlimited means max-depth is unlimited i.e depth is unhecked.

both constants are -1, meaning by default max-depth checks are off. But the code uses the correct constant depending on the context.

need to clamp max depth if -> symlinks are followed , files can be added multiple times, and max-depth is unspecified.  check if max-depth is unspecified using hasArgsSupplied function.
these were only added to windows before.

the script is adjusted from pkg/snclient/t/scripts/check_files_filesystem_links_2.ps1 using ai to convert it from powershell to bash

the tests see if the files are accessible over multiple links including recursive links

add test for max-depth adjustment for infinite recursion. if symlinks are followed, files are not added only once, and max-depth is unspecified, it is clamped with a ceiling value to prevent unlimited recursion
differences between gnu and freebsd find
@lgmu lgmu requested a review from sni July 14, 2026 09:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants