Issue an error message when fts_read fails. Fixes bug #39324.

* find/ftsfind.c (find): when fts_read fails, issue an error
message, set the exit status to zero and stop.  Previously the
program would just stop (i.e. it failed to distinguish "done" from
"failed").
* find/find.1 (-exec): explain that on failure, some pending
command launches may not happen.  The Texinfo documentation
already pointed this out, so that didn't need to be changed.
* NEWS: Mention this bugfix.
This commit is contained in:
James Youngman
2013-09-22 15:20:38 +01:00
parent 6cd5d3b1a8
commit 96df69c709
4 changed files with 46 additions and 3 deletions

View File

@@ -1,3 +1,15 @@
2013-09-22 James Youngman <jay@gnu.org>
Issue an error message when fts_read fails. Fixes bug #39324.
* find/ftsfind.c (find): when fts_read fails, issue an error
message, set the exit status to zero and stop. Previously the
program would just stop (i.e. it failed to distinguish "done" from
"failed").
* find/find.1 (-exec): explain that on failure, some pending
command launches may not happen. The Texinfo documentation
already pointed this out, so that didn't need to be changed.
* NEWS: Mention this bugfix.
2013-09-21 James Youngman <jay@gnu.org>
find: state that -execdir command is run locally to the matched file.

2
NEWS
View File

@@ -47,6 +47,8 @@ database, though they are in the ChangeLog:
These following fixed bugs are recorded at
https://savannah.gnu.org/bugs/?group=findutils:
#39324: exits without error on OOM
#38474: Unintended (?) behaviour change of -perm +mode predicate
#38583: errno-buffer read failed in xargs_do_exec

View File

@@ -1014,7 +1014,11 @@ command will be much less than the number of matched files. The
command line is built in much the same way that
.B xargs
builds its command lines. Only one instance of `{}' is allowed within
the command. The command is executed in the starting directory.
the command. The command is executed in the starting directory. If
.B find
encounters an error, this can sometimes cause an
immediate exit, so some pending commands may not be run
at all.
.IP "\-execdir \fIcommand\fR ;"
.IP "\-execdir \fIcommand\fR {} +"
@@ -1043,7 +1047,11 @@ appropriately-named file in a directory in which you will run
.BR \-execdir .
The same applies to having entries in
.B $PATH
which are empty or which are not absolute directory names.
which are empty or which are not absolute directory names. If
.B find
encounters an error, this can sometimes cause an
immediate exit, so some pending commands may not be run
at all.
.IP "\-fls \fIfile\fR"
True; like
@@ -2020,6 +2028,17 @@ description, but if the return value is non-zero, you should not rely
on the correctness of the results of
.BR find .
When some error occurs,
.B find
may stop immeidately, without completing all the actions specified.
For example, some starting points may not have been examined or some
pending program invocations for
.B \-exec ... {} +
or
.B \-execdir ... {} +
may not have been performed.
.SH "SEE ALSO"
\fBlocate\fP(1), \fBlocatedb\fP(5), \fBupdatedb\fP(1), \fBxargs\fP(1),
\fBchmod\fP(1), \fBfnmatch\fP(3), \fBregex\fP(7), \fBstat\fP(2),

View File

@@ -564,7 +564,7 @@ find (char *arg)
{
int level = INT_MIN;
while ( (ent=fts_read (p)) != NULL )
while ( (errno=0, ent=fts_read (p)) != NULL )
{
if (state.execdirs_outstanding)
{
@@ -589,6 +589,16 @@ find (char *arg)
state.type = state.have_type ? ent->fts_statp->st_mode : 0;
consider_visiting (p, ent);
}
/* fts_read returned NULL; distinguish between "finished" and "error". */
if (errno)
{
error (0, errno,
"failed to read file names from file system at or below %s",
safely_quote_err_filename (0, arg));
error_severity (EXIT_FAILURE);
return false;
}
if (0 != fts_close (p))
{
/* Here we break the abstraction of fts_close a bit, because we