[PATCH] date: permit compatible dates in -d option

David Leonard David.Leonard at digi.com
Fri Oct 16 01:27:09 UTC 2020


When FEATURE_DATE_COMPAT is enabled, also permit POSIX-style
MMDDHHMM[[CC]YY] formats to be used with -d.

This form is used by ancient versions of hwclock.
---
  coreutils/date.c                 | 50 +++++++++++++++++---------------
  testsuite/date/date-compat-works |  7 +++++
  2 files changed, 34 insertions(+), 23 deletions(-)
  create mode 100644 testsuite/date/date-compat-works

diff --git a/coreutils/date.c b/coreutils/date.c
index d84e1c31a..cdc5a2d0f 100644
--- a/coreutils/date.c
+++ b/coreutils/date.c
@@ -224,33 +224,37 @@ int date_main(int argc UNUSED_PARAM, char **argv)
  		opt |= OPT_SET;
  		date_str = argv[0]; /* can be NULL */
  		if (date_str) {
+			argv++;
+		}
+	}
+
  #if ENABLE_FEATURE_DATE_COMPAT
-			int len = strspn(date_str, "0123456789");
-			if (date_str[len] == '\0'
-			 || (date_str[len] == '.'
-			    && isdigit(date_str[len+1])
-			    && isdigit(date_str[len+2])
-			    && date_str[len+3] == '\0'
-			    )
-			) {
-				/* Dreaded MMDDhhmm[[CC]YY][.ss] format!
-				 * It does not match -d or -s format.
-				 * Some users actually do use it.
-				 */
-				len -= 8;
-				if (len < 0 || len > 4 || (len & 1))
-					bb_error_msg_and_die(bb_msg_invalid_date, date_str);
-				if (len != 0) { /* move YY or CCYY to front */
-					char buf[4];
-					memcpy(buf, date_str + 8, len);
-					memmove(date_str + len, date_str, 8);
-					memcpy(date_str, buf, len);
-				}
+	if (date_str) {
+		int len = strspn(date_str, "0123456789");
+		if (date_str[len] == '\0'
+		 || (date_str[len] == '.'
+		    && isdigit(date_str[len+1])
+		    && isdigit(date_str[len+2])
+		    && date_str[len+3] == '\0'
+		    )
+		) {
+			/* Dreaded MMDDhhmm[[CC]YY][.ss] format!
+			 * It does not match -d or -s format.
+			 * Some users actually do use it.
+			 */
+			len -= 8;
+			if (len < 0 || len > 4 || (len & 1))
+				bb_error_msg_and_die(bb_msg_invalid_date, date_str);
+			if (len != 0) { /* move YY or CCYY to front */
+				char buf[4];
+				memcpy(buf, date_str + 8, len);
+				memmove(date_str + len, date_str, 8);
+				memcpy(date_str, buf, len);
  			}
-#endif
-			argv++;
  		}
  	}
+#endif
+
  	if (*argv)
  		bb_show_usage();

diff --git a/testsuite/date/date-compat-works b/testsuite/date/date-compat-works
new file mode 100644
index 000000000..c412428e2
--- /dev/null
+++ b/testsuite/date/date-compat-works
@@ -0,0 +1,7 @@
+# FEATURE: CONFIG_FEATURE_DATE_COMPAT
+
+# MMDDhhmm[[CC]YY][.ss]
+test x0 = x`busybox date -u -d 010100001970 +%s`
+test x2147483647 = x`busybox date -u -d 011903142038.07 +%s`
+test x994982399 = x`busybox date -u -d 1231235999.59 +%s`
+test x915148800 = x`busybox date -u -d 0101000099 +%s`
-- 
2.25.1



More information about the busybox mailing list