find: Treat errno from fts_read() more carefully.

fts_read() leaves errno unchanged on EOF and sets it on error, so set errno
to 0 before calling it. Also, don't trust finish_execplus() to leave errno
unchanged.
This commit is contained in:
Jilles Tjoelker 2014-04-06 20:04:33 +00:00
parent a90feb39a2
commit 73a0af46b8

View File

@ -175,13 +175,13 @@ find_execute(PLAN *plan, char *paths[])
{
FTSENT *entry;
PLAN *p;
int rval;
int e, rval;
tree = fts_open(paths, ftsoptions, (issort ? find_compare : NULL));
if (tree == NULL)
err(1, "ftsopen");
for (rval = 0; (entry = fts_read(tree)) != NULL;) {
for (rval = 0; errno = 0, (entry = fts_read(tree)) != NULL;) {
if (maxdepth != -1 && entry->fts_level >= maxdepth) {
if (fts_set(tree, entry, FTS_SKIP))
err(1, "%s", entry->fts_path);
@ -231,8 +231,9 @@ find_execute(PLAN *plan, char *paths[])
*/
for (p = plan; p && (p->execute)(p, entry); p = p->next);
}
e = errno;
finish_execplus();
if (errno && (!ignore_readdir_race || errno != ENOENT))
err(1, "fts_read");
if (e && (!ignore_readdir_race || e != ENOENT))
errc(1, e, "fts_read");
return (rval);
}