| --- busybox-1.22.1/libbb/time.c |
| +++ busybox-1.22.1-date/libbb/time.c |
| @@ -68,15 +68,23 @@ void FAST_FUNC parse_datestr(const char |
| /* else end != NUL and we error out */ |
| } |
| } else |
| - /* yyyy-mm-dd HH */ |
| - if (sscanf(date_str, "%u-%u-%u %u%c", &ptm->tm_year, |
| + if (strchr(date_str, '-') |
| + /* Why strchr('-') check? |
| + * sscanf below will trash ptm->tm_year, this breaks |
| + * if parse_str is "10101010" (iow, "MMddhhmm" form) |
| + * because we destroy year. Do these sscanf |
| + * only if we saw a dash in parse_str. |
| + */ |
| + /* yyyy-mm-dd HH */ |
| + && (sscanf(date_str, "%u-%u-%u %u%c", &ptm->tm_year, |
| &ptm->tm_mon, &ptm->tm_mday, |
| &ptm->tm_hour, |
| &end) >= 4 |
| - /* yyyy-mm-dd */ |
| - || sscanf(date_str, "%u-%u-%u%c", &ptm->tm_year, |
| + /* yyyy-mm-dd */ |
| + || sscanf(date_str, "%u-%u-%u%c", &ptm->tm_year, |
| &ptm->tm_mon, &ptm->tm_mday, |
| &end) >= 3 |
| + ) |
| ) { |
| ptm->tm_year -= 1900; /* Adjust years */ |
| ptm->tm_mon -= 1; /* Adjust month from 1-12 to 0-11 */ |