diff --git a/coreutils/date.c b/coreutils/date.c index 51200e64c..11b63eaeb 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 b31683b67..85c72d163 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,