[PATCH] Fix rfc2822 date parser
From: Edgar Toernig <hidden>
Date: 2016-06-15 22:41:54
- Fix some broken tests like "if (!tm.tm_sec > 59)" - Make seconds optional - Allow trailing comments like (EDT) - Stand-alone mktime without timezone correction Ciao, ET. diff -u git-0.6-orig/commit-tree.c git-0.6/commit-tree.c
--- git-0.6-orig/commit-tree.c Thu Apr 21 19:58:47 2005
+++ git-0.6/commit-tree.c Mon Apr 25 23:06:36 2005@@ -113,6 +113,25 @@ } } +static time_t my_mktime(struct tm *tm) +{ + static const int mdays[] = { + 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 + }; + int year = tm->tm_year - 70; + int month = tm->tm_mon; + int day = tm->tm_mday; + + if (year < 0 || year > 129) /* algo only works for 1970-2099 */ + return -1; + if (month < 0 || month > 11) /* array bounds */ + return -1; + if (month < 2 || (year + 2) % 4) + day--; + return (year * 365 + (year + 1) / 4 + mdays[month] + day) * 24*60*60UL + + tm->tm_hour * 60*60 + tm->tm_min * 60 + tm->tm_sec; +} + static const char *month_names[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
@@ -194,7 +213,7 @@ return; tm.tm_hour = strtoul(p, &p, 10); - if (!tm.tm_hour > 23) + if (tm.tm_hour > 23) return; if (*p != ':')
@@ -206,14 +225,11 @@ return; tm.tm_min = strtoul(p, &p, 10); - if (!tm.tm_min > 59) + if (tm.tm_min > 59) return; - if (isspace(*p)) - goto zone; - if (*p != ':') - return; /* Error -- bad time */ + goto zone; p++; /* second */
@@ -221,13 +237,13 @@ return; tm.tm_sec = strtoul(p, &p, 10); - if (!tm.tm_sec > 59) + if (tm.tm_sec > 59) return; + zone: if (!isspace(*p)) return; - zone: p = skipfws(p); if (*p == '-')
@@ -243,10 +259,11 @@ i = strtoul(p+1, NULL, 10); offset *= ((i % 100) + ((i / 100) * 60)); - if (*(skipfws(p + 5))) + p = skipfws(p + 5); + if (*p && *p != '(') /* trailing comment like (EDT) is ok */ return; - then = mktime(&tm); /* mktime appears to ignore the GMT offset, stupidly */ + then = my_mktime(&tm); /* mktime appears to ignore the GMT offset, stupidly */ if (then == -1) return;