diff options
author | teor <teor2345@gmail.com> | 2014-10-20 02:47:31 +1100 |
---|---|---|
committer | teor <teor2345@gmail.com> | 2014-10-20 02:47:31 +1100 |
commit | d7b13543e2305de38f7e17e7bcd1e5174fd89152 (patch) | |
tree | 72d8cfbc15ecc37812b254e9a07f39173195acb8 /src | |
parent | 238b8eaa60953a4d716ece484aaaca841b46c614 (diff) | |
download | tor-d7b13543e2305de38f7e17e7bcd1e5174fd89152.tar.gz tor-d7b13543e2305de38f7e17e7bcd1e5174fd89152.zip |
Clamp (some) years supplied by the system to 1 CE
Clamp year values returned by system localtime(_r) and
gmtime(_r) to year 1. This ensures tor can read any
values it might write out.
Fixes bug 13476.
Diffstat (limited to 'src')
-rw-r--r-- | src/common/compat.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/src/common/compat.c b/src/common/compat.c index f8b1d15806..b6fdb1ad78 100644 --- a/src/common/compat.c +++ b/src/common/compat.c @@ -2770,7 +2770,9 @@ correct_tm(int islocal, const time_t *timep, struct tm *resultbuf, const char *outcome; if (PREDICT_LIKELY(r)) { - if (r->tm_year > 8099) { /* We can't strftime dates after 9999 CE. */ + /* We can't strftime dates after 9999 CE, and we want to avoid dates + * before 1 CE (avoiding the year 0 issue and negative years). */ + if (r->tm_year > 8099) { r->tm_year = 8099; r->tm_mon = 11; r->tm_mday = 31; @@ -2778,6 +2780,14 @@ correct_tm(int islocal, const time_t *timep, struct tm *resultbuf, r->tm_hour = 23; r->tm_min = 59; r->tm_sec = 59; + } else if (r->tm_year < (1-1900)) { + r->tm_year = (1-1900); + r->tm_mon = 0; + r->tm_mday = 1; + r->tm_yday = 0; + r->tm_hour = 0; + r->tm_min = 0; + r->tm_sec = 0; } return r; } |