Page MenuHomeFreeBSD

mtree -c { -O | -X }: Avoid silently ignoring errors from fts(3)
AbandonedPublic

Authored by bdrewery on Nov 10 2020, 6:18 PM.
Tags
None
Referenced Files
Unknown Object (File)
Feb 11 2024, 2:15 PM
Unknown Object (File)
Dec 15 2023, 11:35 PM
Unknown Object (File)
Nov 1 2023, 4:49 AM
Unknown Object (File)
Oct 30 2023, 4:56 PM
Unknown Object (File)
Oct 30 2023, 10:26 AM
Unknown Object (File)
Sep 29 2023, 1:13 AM
Unknown Object (File)
Aug 31 2023, 8:39 PM
Unknown Object (File)
Jul 10 2023, 7:01 PM
Subscribers
None

Details

Summary

With an only (-O), or excludes (-X), filter it is possible for fts_read(3)
to encounter some error that sets FTS_STOP while looking at an ignored
path. No error is printed because it is not a wanted path. Further reads
return NULL indicating a successful end. Thus later encountered paths
that are expected never are recorded and no error is indicated on stderr
nor for exit status.

While here don't handle jflag logic if this path is ignored.

This seems trivial but I put it out for review as it is hard to test well.

Test Plan
/usr/tests/usr.sbin/nmtree # kyua test
nmtree_test:mtree_check  ->  passed  [0.028s]
nmtree_test:mtree_convert_C  ->  passed  [0.020s]
nmtree_test:mtree_convert_C_S  ->  passed  [0.020s]
nmtree_test:mtree_convert_D  ->  passed  [0.020s]
nmtree_test:mtree_convert_D_S  ->  passed  [0.020s]
nmtree_test:mtree_create  ->  passed  [0.028s]
nmtree_test:mtree_ignore  ->  passed  [0.050s]
nmtree_test:mtree_merge  ->  passed  [0.024s]
nmtree_test:mtree_nonemptydir  ->  passed  [0.028s]
nmtree_test:mtree_specspec_type  ->  passed  [0.035s]
nmtree_test:netbsd6_check  ->  passed  [0.027s]
nmtree_test:netbsd6_convert_C  ->  passed  [0.020s]
nmtree_test:netbsd6_convert_C_S  ->  passed  [0.020s]
nmtree_test:netbsd6_convert_D  ->  passed  [0.019s]
nmtree_test:netbsd6_convert_D_S  ->  passed  [0.019s]
nmtree_test:netbsd6_create  ->  passed  [0.028s]
nmtree_test:netbsd6_ignore  ->  passed  [0.035s]
nmtree_test:netbsd6_merge  ->  passed  [0.023s]
nmtree_test:netbsd6_nonemptydir  ->  passed  [0.027s]

Results file id is usr_tests_usr.sbin_nmtree.20201110-180914-198829
Results saved to /root/.kyua/store/results.usr_tests_usr.sbin_nmtree.20201110-180914-198829.db

19/19 passed (0 failed)

Also used custom kernel failpoints in a downstream kernel (OneFS) to inject EIO.

Expected result:

> cat ~/only
./ifs/blah
./include
> mtree -c -O ~/only -p / -R all -k uid,gid,mode; echo $?
#          user: root
#       machine: bdrewer-lcnn0c9-3
#          tree: /
#          date: Tue Nov 10 10:14:10 2020

# .
/set type=file uid=0 gid=0 mode=0755
.               type=dir

# ./ifs
/set type=file uid=0 gid=0 mode=0644
ifs             type=dir mode=0777
# ./ifs
..


# ./include
/set type=file uid=0 gid=0 mode=0755
include         type=dir
# ./include
..

0

Actual result that lead to this fix:

> mtree -c -O ~/only -p / -R all -k uid,gid,mode; echo $?
#          user: root
#       machine: bdrewer-lcnn0c9-3
#          tree: /
#          date: Tue Nov 10 10:14:11 2020

# .
/set type=file uid=0 gid=0 mode=0755
.               type=dir

# ./ifs
/set type=file uid=0 gid=0 mode=0644
ifs             type=dir mode=0777
0

Behavior now (added 'xx' to the error to ensure hitting the expected one):

> mtree -c -O ~/only -p / -R all -k uid,gid,mode; echo $?
#          user: root
#       machine: bdrewer-lcnn0c9-3
#          tree: /
#          date: Tue Nov 10 10:16:28 2020

# .
/set type=file uid=0 gid=0 mode=0755
.               type=dir

# ./ifs
/set type=file uid=0 gid=0 mode=0644
ifs             type=dir mode=0777
mtree: xx./ifs/home: Input/output error
1

Diff Detail

Lint
No Lint Coverage
Unit
No Test Coverage
Build Status
Buildable 34725
Build 31782: arc lint + arc unit

Event Timeline

bdrewery created this revision.

In all cases in fts.c, NULL is returned when FTS_STOP is set. The downstream fts is the problem, not FreeBSD or mtree.