[hackers] [sbase][PATCH 1/6] find: Fall back from stat() to lstat() on broken links

From: Tavian Barnes <tavianator_AT_tavianator.com>
Date: Fri, 14 Feb 2025 10:55:16 -0500

---
 find.c | 19 +++++++++++++++++--
 1 file changed, 17 insertions(+), 2 deletions(-)
diff --git a/find.c b/find.c
index ef28232..7243072 100644
--- a/find.c
+++ b/find.c
_AT_@ -112,6 +112,7 @@ struct findhist {
 
 /* Utility */
 static int spawn(char *argv[]);
+static int do_stat(char *path, struct stat *sb, struct findhist *hist);
 
 /* Primaries */
 static int pri_name   (struct arg *arg);
_AT_@ -254,6 +255,20 @@ spawn(char *argv[])
 	return status;
 }
 
+static int
+do_stat(char *path, struct stat *sb, struct findhist *hist)
+{
+	if (gflags.l || (gflags.h && !hist)) {
+		if (stat(path, sb) == 0) {
+			return 0;
+		} else if (errno != ENOENT && errno != ENOTDIR) {
+			return -1;
+		}
+	}
+
+	return lstat(path, sb);
+}
+
 /*
  * Primaries
  */
_AT_@ -664,7 +679,7 @@ get_newer_arg(char *argv[], union extra *extra)
 {
 	struct stat st;
 
-	if (stat(*argv, &st))
+	if (do_stat(*argv, &st, NULL))
 		eprintf("failed to stat '%s':", *argv);
 
 	extra->i = st.st_mtime;
_AT_@ -943,7 +958,7 @@ find(char *path, struct findhist *hist)
 
 	len = strlen(path) + 2; /* \0 and '/' */
 
-	if ((gflags.l || (gflags.h && !hist) ? stat(path, &st) : lstat(path, &st)) < 0) {
+	if (do_stat(path, &st, hist) < 0) {
 		weprintf("failed to stat %s:", path);
 		return;
 	}
-- 
2.48.1
Received on Fri Feb 14 2025 - 16:55:16 CET

This archive was generated by hypermail 2.3.0 : Fri Feb 14 2025 - 18:36:37 CET