svn commit: r264201 - head/usr.bin/find

Jilles Tjoelker jilles at FreeBSD.org
Sun Apr 6 20:04:33 UTC 2014


Author: jilles
Date: Sun Apr  6 20:04:33 2014
New Revision: 264201
URL: http://svnweb.freebsd.org/changeset/base/264201

Log:
  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.

Modified:
  head/usr.bin/find/find.c

Modified: head/usr.bin/find/find.c
==============================================================================
--- head/usr.bin/find/find.c	Sun Apr  6 20:00:42 2014	(r264200)
+++ head/usr.bin/find/find.c	Sun Apr  6 20:04:33 2014	(r264201)
@@ -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);
 }


More information about the svn-src-all mailing list