commit d7b13543e2305de38f7e17e7bcd1e5174fd89152 Author: teor teor2345@gmail.com Date: Mon Oct 20 02:47:31 2014 +1100
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. --- changes/bug13476-improve-time-handling | 3 +++ src/common/compat.c | 12 +++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-)
diff --git a/changes/bug13476-improve-time-handling b/changes/bug13476-improve-time-handling index 68dc3e6..1fe60c6 100644 --- a/changes/bug13476-improve-time-handling +++ b/changes/bug13476-improve-time-handling @@ -10,3 +10,6 @@ for validity, taking leap years into account. Improves HTTP header validation. Implemented with bug 13476. + - 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. diff --git a/src/common/compat.c b/src/common/compat.c index f8b1d15..b6fdb1a 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; }