[git commit master] date: restore hadling of MMDDhhmm[[CC]YY][.ss] date format

Denys Vlasenko vda.linux at googlemail.com
Sun Nov 15 03:55:40 UTC 2009


commit: http://git.busybox.net/busybox/commit/?id=ff1822aed159e1c1b5a92dc5c1fd1648b026f8f4
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master

function                                             old     new   delta
date_main                                            698     889    +191

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 coreutils/date.c |   27 ++++++++++++++++++++++++++-
 libbb/time.c     |    8 ++++----
 2 files changed, 30 insertions(+), 5 deletions(-)

diff --git a/coreutils/date.c b/coreutils/date.c
index 51200e6..11b63ea 100644
--- a/coreutils/date.c
+++ b/coreutils/date.c
@@ -123,8 +123,33 @@ int date_main(int argc UNUSED_PARAM, char **argv)
 	if (!(opt & (OPT_SET | OPT_DATE))) {
 		opt |= OPT_SET;
 		date_str = argv[0]; /* can be NULL */
-		if (date_str)
+		if (date_str) {
+#if ENABLE_DESKTOP
+			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++;
+		}
 	}
 	if (*argv)
 		bb_show_usage();
diff --git a/libbb/time.c b/libbb/time.c
index b31683b..85c72d1 100644
--- a/libbb/time.c
+++ b/libbb/time.c
@@ -74,25 +74,25 @@ void FAST_FUNC parse_datestr(const char *date_str, struct tm *tm_time)
 		int len = strchrnul(date_str, '.') - date_str;
 
 		/* MM[.SS] */
-		if (len == 2 && sscanf(date_str, "%2u%2u%2u%2u%2u%c" + 12,
+		if (len == 2 && sscanf(date_str, "%2u%2u%2u%2u""%2u%c" + 12,
 					&tm_time->tm_min,
 					&end) >= 1) {
 		} else
 		/* HHMM[.SS] */
-		if (len == 4 && sscanf(date_str, "%2u%2u%2u%2u%2u%c" + 9,
+		if (len == 4 && sscanf(date_str, "%2u%2u%2u""%2u%2u%c" + 9,
 					&tm_time->tm_hour,
 					&tm_time->tm_min,
 					&end) >= 2) {
 		} else
 		/* ddHHMM[.SS] */
-		if (len == 6 && sscanf(date_str, "%2u%2u%2u%2u%2u%c" + 6,
+		if (len == 6 && sscanf(date_str, "%2u%2u""%2u%2u%2u%c" + 6,
 					&tm_time->tm_mday,
 					&tm_time->tm_hour,
 					&tm_time->tm_min,
 					&end) >= 3) {
 		} else
 		/* mmddHHMM[.SS] */
-		if (len == 8 && sscanf(date_str, "%2u%2u%2u%2u%2u%c" + 3,
+		if (len == 8 && sscanf(date_str, "%2u""%2u%2u%2u%2u%c" + 3,
 					&tm_time->tm_mon,
 					&tm_time->tm_mday,
 					&tm_time->tm_hour,
-- 
1.6.3.3



More information about the busybox-cvs mailing list