When parsing user supplied time strings, calculate an UTC time instant by
substracting the current zone offset from the result of mktime(3), then use
gmtime_r(3) to turn the time_t value back into a sanitized time structure.
This ensures that user supplied dates are not interpreted as local time.
Fixes FS#1483.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
{
unsigned int year = 1970, mon = 1, day = 1, hour = 0, min = 0, sec = 0;
struct tm tm = { 0 };
+ time_t ts;
char *p;
year = strtoul(val, &p, 10);
tm.tm_min = min;
tm.tm_sec = sec;
- if (mktime(&tm) >= 0)
+ ts = mktime(&tm) - timezone;
+
+ if (ts >= 0)
{
- *((struct tm *)ptr) = tm;
+ gmtime_r(&ts, (struct tm *)ptr);
return true;
}