summaryrefslogtreecommitdiffstats
path: root/src/datetime.c
diff options
context:
space:
mode:
authorP. 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)
commit84ecc332421e4749ec5a35bddc656dd854ebe16e (patch)
treed545cd5759c2dad454deccfa6bcf784ef58b31d1 /src/datetime.c
parentcf9c057d273399f29eb0b86afa50294ad5d14d6d (diff)
downloadatsign-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'
Diffstat (limited to 'src/datetime.c')
-rw-r--r--src/datetime.c48
1 files changed, 37 insertions, 11 deletions
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