bug#81444: chown, chmod, chgrp, chcon, ls: --recursive walk does not ignore ENOENT errors
Paul Holzinger via GNU coreutils Bug Reports <[email protected]> Thu, 23 Jul 2026 11:06:57 +0200
| Newsgroups | gmane.comp.gnu.core-utils.bugs |
|---|---|
| Message-ID | <[email protected]> |
Hi Padraig, On 22/07/2026 21:51, Pádraig Brady wrote: > On 20/07/2026 18:12, Paul Holzinger via GNU coreutils Bug Reports wrote: >> Hi, >> >> I noticed that when chown'ing a directory tree recursively with many >> files sometimes chown will exit 1 and report ENOENT errors. This happens >> when looping over the directory results from readdir() and in a parallel >> another process removes a file before the code then calls stat(), >> chmod() or whatever syscalls the command has to do for the given >> filename. >> >> Since such race is expected the coreutils should not treat this as error >> and just ignore them instead. That way a parallel removal of a file will >> not make the commands return exit code 1 and thus possibility break >> scripts. Of course this should only apply to files or directories under >> the main path given as input, i.e. chmod -R dest should still fail with >> ENOENT when dest does not exists. >> >> Below is a reproducer for the commands, might needs to run a few times >> until it triggers the race condition, I am not sure if there are more >> commands in coreutils which are affected by this. > Thanks for the repro, it works well. > > I agree, these commands shouldn't warn or fail for files > being added, replaced, removed in the tree being traversed. > I also notice that du is affected. > > The attached should hopefully address this issue. Thanks for the patch, I tested it with the reproducer and it works well. I also agree with the other comments, just ignoring ENOENT is good enough for me. Thanks, Paul Holzinger