diff options
author | P. J. McDermott <pj@pehjota.net> | 2022-03-19 21:25:10 (EDT) |
---|---|---|
committer | P. J. McDermott <pj@pehjota.net> | 2022-03-19 21:36:41 (EDT) |
commit | 84ecc332421e4749ec5a35bddc656dd854ebe16e (patch) | |
tree | d545cd5759c2dad454deccfa6bcf784ef58b31d1 | |
parent | cf9c057d273399f29eb0b86afa50294ad5d14d6d (diff) | |
download | atsign-84ecc332421e4749ec5a35bddc656dd854ebe16e.zip atsign-84ecc332421e4749ec5a35bddc656dd854ebe16e.tar.gz atsign-84ecc332421e4749ec5a35bddc656dd854ebe16e.tar.bz2 |
datetime: Sanity check parsing results
Previously, "0000 1970-01-01" was parsed as 00:00:19 70-01-01.
Fixes:
not ok 614 - 0000 1970-01-01
FAIL: tests/parse.sh 614 - 0000 1970-01-01
# Failed test '0000 1970-01-01'
# got: '-59958143981'
# expected: '0'
ok 615 - 1970/01/01 0000
PASS: tests/parse.sh 615 - 1970/01/01 0000
not ok 616 - 0000 1970/01/01
FAIL: tests/parse.sh 616 - 0000 1970/01/01
# Failed test '0000 1970/01/01'
# got: '-59958143981'
# expected: '0'
-rw-r--r-- | TODO | 1 | ||||
-rw-r--r-- | src/datetime.c | 48 |
2 files changed, 37 insertions, 12 deletions
@@ -1,5 +1,4 @@ spaces between specifiers in strptime() formats -- strftime()? test with other libc's (newlib? musl? fbsd? obsd?) -formats beginning with HHMM are mis-parsed as years `./@ 7:00 PM` doesn't work with musl strptime() gettext? diff --git a/src/datetime.c b/src/datetime.c index 994d3fe..a3b4c58 100644 --- a/src/datetime.c +++ b/src/datetime.c @@ -192,6 +192,8 @@ datetime_parse(struct tm *now_tm, const char *input, time_t *arg_sec) size_t t; char *end; struct tm arg_tm; + time_t sec; + bool got; date_fmt_len = strlen(DATETIME_DATE_FMTS_[0]); time_fmt_len = strlen(DATETIME_TIME_FMTS_[0]); @@ -202,14 +204,20 @@ datetime_parse(struct tm *now_tm, const char *input, time_t *arg_sec) return -1; } + sec = *arg_sec; /* GCC is dumb. */ + got = false; for (t = 0; t < sizeof(DATETIME_TIME_FMTS_) / sizeof(DATETIME_TIME_FMTS_[0]) ; ++t) { _datetime_reset_tm(&arg_tm); end = strptime(input, DATETIME_TIME_FMTS_[t], &arg_tm); if (end != NULL && *end == '\0') { - free(fmt_buf); _datetime_normalize(now_tm, &arg_tm, arg_sec); - return 0; + if (datetime_diff_epoch(*arg_sec) >= 0) { + free(fmt_buf); + return 0; + } + sec = *arg_sec; + got = true; } } for (d = 0; d < sizeof(DATETIME_DATE_FMTS_) / @@ -222,9 +230,13 @@ datetime_parse(struct tm *now_tm, const char *input, time_t *arg_sec) _datetime_reset_tm(&arg_tm); end = strptime(input, fmt_buf, &arg_tm); if (end != NULL && *end == '\0') { - free(fmt_buf); _datetime_normalize(now_tm, &arg_tm, arg_sec); - return 0; + if (datetime_diff_epoch(*arg_sec) >= 0) { + free(fmt_buf); + return 0; + } + sec = *arg_sec; + got = true; } } } @@ -238,9 +250,13 @@ datetime_parse(struct tm *now_tm, const char *input, time_t *arg_sec) _datetime_reset_tm(&arg_tm); end = strptime(input, fmt_buf, &arg_tm); if (end != NULL && *end == '\0') { - free(fmt_buf); _datetime_normalize(now_tm, &arg_tm, arg_sec); - return 0; + if (datetime_diff_epoch(*arg_sec) >= 0) { + free(fmt_buf); + return 0; + } + sec = *arg_sec; + got = true; } } } @@ -249,15 +265,25 @@ datetime_parse(struct tm *now_tm, const char *input, time_t *arg_sec) _datetime_reset_tm(&arg_tm); end = strptime(input, DATETIME_MISC_FMTS_[d], &arg_tm); if (end != NULL && *end == '\0') { - free(fmt_buf); _datetime_normalize(now_tm, &arg_tm, arg_sec); - return 0; + if (datetime_diff_epoch(*arg_sec) >= 0) { + free(fmt_buf); + return 0; + } + sec = *arg_sec; + got = true; } } - free(fmt_buf); - fputs("Unknown date format\n", stderr); - return -1; + if (got == true) { + *arg_sec = sec; + free(fmt_buf); + return 0; + } else { + fputs("Unknown date format\n", stderr); + free(fmt_buf); + return -1; + } } static void |