git: 3c67983babbb - stable/13 - Handle NULL return from localtime(3) in ls(1) and find(1)

From: Kirk McKusick <mckusick_at_FreeBSD.org>
Date: Tue, 27 Sep 2022 16:20:49 UTC
The branch stable/13 has been updated by mckusick:

URL: https://cgit.FreeBSD.org/src/commit/?id=3c67983babbb2c51e29424165f87adc8c4bf7dda

commit 3c67983babbb2c51e29424165f87adc8c4bf7dda
Author:     Kirk McKusick <mckusick@FreeBSD.org>
AuthorDate: 2022-09-09 21:29:53 +0000
Commit:     Kirk McKusick <mckusick@FreeBSD.org>
CommitDate: 2022-09-27 16:20:29 +0000

    Handle NULL return from localtime(3) in ls(1) and find(1)
    
    (cherry picked from commit 927f8d8bbbed70f6c88d05c19b5b366f8e7532c9)
---
 bin/ls/print.c    | 11 ++++++-----
 usr.bin/find/ls.c |  6 +++++-
 2 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/bin/ls/print.c b/bin/ls/print.c
index bbe5c6f8a6f6..5e8a54ca0620 100644
--- a/bin/ls/print.c
+++ b/bin/ls/print.c
@@ -432,18 +432,17 @@ printdev(size_t width, dev_t dev)
 	(void)printf("%#*jx ", (u_int)width, (uintmax_t)dev);
 }
 
-static size_t
+static void
 ls_strftime(char *str, size_t len, const char *fmt, const struct tm *tm)
 {
 	char *posb, nfmt[BUFSIZ];
 	const char *format = fmt;
-	size_t ret;
 
 	if ((posb = strstr(fmt, "%b")) != NULL) {
 		if (month_max_size == 0) {
 			compute_abbreviated_month_size();
 		}
-		if (month_max_size > 0) {
+		if (month_max_size > 0 && tm != NULL) {
 			snprintf(nfmt, sizeof(nfmt),  "%.*s%s%*s%s",
 			    (int)(posb - fmt), fmt,
 			    get_abmon(tm->tm_mon),
@@ -453,8 +452,10 @@ ls_strftime(char *str, size_t len, const char *fmt, const struct tm *tm)
 			format = nfmt;
 		}
 	}
-	ret = strftime(str, len, format, tm);
-	return (ret);
+	if (tm != NULL)
+		strftime(str, len, format, tm);
+	else
+		strlcpy(str, "bad date val", len);
 }
 
 static void
diff --git a/usr.bin/find/ls.c b/usr.bin/find/ls.c
index 8c4c16ed3461..8d7406216256 100644
--- a/usr.bin/find/ls.c
+++ b/usr.bin/find/ls.c
@@ -88,6 +88,7 @@ printtime(time_t ftime)
 	static time_t lnow;
 	const char *format;
 	static int d_first = -1;
+	struct tm *tm;
 
 #ifdef D_MD_ORDER
 	if (d_first < 0)
@@ -103,7 +104,10 @@ printtime(time_t ftime)
 	else
 		/* mmm dd  yyyy || dd mmm  yyyy */
 		format = d_first ? "%e %b  %Y " : "%b %e  %Y ";
-	strftime(longstring, sizeof(longstring), format, localtime(&ftime));
+	if ((tm = localtime(&ftime)) != NULL)
+		strftime(longstring, sizeof(longstring), format, tm);
+	else
+		strlcpy(longstring, "bad date val ", sizeof(longstring));
 	fputs(longstring, stdout);
 }