options: treat time strings as UTC times
authorJo-Philipp Wich <jo@mein.io>
Thu, 12 Apr 2018 08:51:51 +0000 (10:51 +0200)
committerJo-Philipp Wich <jo@mein.io>
Wed, 16 May 2018 07:04:10 +0000 (09:04 +0200)
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>
options.c

index b5d5c02ff2fa24f0c1f6bc057b56dd1c64451cb8..087aa630469afa8eea81238a4fb9c6accc44d414 100644 (file)
--- a/options.c
+++ b/options.c
@@ -641,6 +641,7 @@ fw3_parse_date(void *ptr, const char *val, bool is_list)
 {
        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);
@@ -685,9 +686,11 @@ ret:
        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;
        }