aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorteor <teor2345@gmail.com>2014-10-20 02:47:31 +1100
committerteor <teor2345@gmail.com>2014-10-20 02:47:31 +1100
commitd7b13543e2305de38f7e17e7bcd1e5174fd89152 (patch)
tree72d8cfbc15ecc37812b254e9a07f39173195acb8 /src
parent238b8eaa60953a4d716ece484aaaca841b46c614 (diff)
downloadtor-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.c12
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;
}