git: 727bc500264b - stable/14 - Bail out of corrupt directory entries during boot

From: Kirk McKusick <mckusick_at_FreeBSD.org>
Date: Sat, 30 Aug 2025 22:58:14 UTC
The branch stable/14 has been updated by mckusick:

URL: https://cgit.FreeBSD.org/src/commit/?id=727bc500264bffc48b699a88e00a0baa14cbe73d

commit 727bc500264bffc48b699a88e00a0baa14cbe73d
Author:     Kirk McKusick <mckusick@FreeBSD.org>
AuthorDate: 2025-08-22 05:33:48 +0000
Commit:     Kirk McKusick <mckusick@FreeBSD.org>
CommitDate: 2025-08-30 22:56:26 +0000

    Bail out of corrupt directory entries during boot
    
    Reported-by:  Daniel O'Connor darius-dons.net.au
    MFC-after:    1 week
    Sponsored-by: Netflix
    Differential-Revision: https://reviews.freebsd.org/D2844
    
    (cherry picked from commit 690ae8a2025ca1ce58d08a90a1df1645c81392ea)
---
 stand/libsa/ufs.c     | 6 ++++++
 stand/libsa/ufsread.c | 7 +++++++
 2 files changed, 13 insertions(+)

diff --git a/stand/libsa/ufs.c b/stand/libsa/ufs.c
index e1d540ed2321..7782ba370272 100644
--- a/stand/libsa/ufs.c
+++ b/stand/libsa/ufs.c
@@ -890,6 +890,12 @@ ufs_readdir(struct open_file *f, struct dirent *d)
 		if (error)
 			return (error);
 		dp = (struct direct *)buf;
+		/*
+		 * Check for corrupt directory entry and bail out rather
+		 * than spin forever hoping that the user has other options.
+		 */
+		if (dp->d_reclen == 0)
+			return (0);
 		fp->f_seekp += dp->d_reclen;
 	} while (dp->d_ino == (ino_t)0);
 
diff --git a/stand/libsa/ufsread.c b/stand/libsa/ufsread.c
index 0f9b9bb4e2fb..86ac8fbbbab7 100644
--- a/stand/libsa/ufsread.c
+++ b/stand/libsa/ufsread.c
@@ -108,6 +108,13 @@ fsfind(const char *name, ufs_ino_t * ino)
 				*ino = d.d_ino;
 				return d.d_type;
 			}
+			/*
+			 * Check for corrupt directory entry and bail out
+			 * rather than spin forever hoping that the user
+			 * has other options.
+			 */
+			if (d.d_reclen == 0)
+				return 0;
 			s += d.d_reclen;
 		}
 	if (n != -1 && ls)