From 00e4b59bfb878fb35bcd78d18a51a827689ae6a5 Mon Sep 17 00:00:00 2001 From: wiire Date: Mon, 4 Jan 2016 10:05:16 +0100 Subject: [PATCH] Fixed time conversion issue due to different timezones and DST Now UTC is used. --- src/pixiewps.c | 37 +++++++++++++++++------------------ src/utils.h | 52 +++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 61 insertions(+), 28 deletions(-) diff --git a/src/pixiewps.c b/src/pixiewps.c index d3463d5..c1070a4 100644 --- a/src/pixiewps.c +++ b/src/pixiewps.c @@ -79,7 +79,7 @@ memory_err: return MEM_ERROR; } - time_t start_p = 0, end_p = 0; + time_t start_p = (time_t) -1, end_p = (time_t) -1; clock_t c_start = 0, c_end; int opt = 0; @@ -185,9 +185,10 @@ memory_err: struct tm ts; char buffer[30]; r_time = t_current.tv_sec; - ts = *localtime(&r_time); + ts = *gmtime(&r_time); strftime(buffer, 30, "%c", &ts); - fprintf(stderr, "\n Pixiewps %s\n\n [*] System time: %s\n\n", LONG_VERSION, buffer); + fprintf(stderr, "\n Pixiewps %s\n\n [*] System time: %lu (%s UTC)\n\n", + LONG_VERSION, (unsigned long) t_current.tv_sec, buffer); free(wps->error); free(wps); return ARG_ERROR; @@ -290,11 +291,9 @@ usage_err: } /* Cannot specify --start or --end if --force is selected */ - if (wps->bruteforce && (start_p || end_p)) { - if (start_p || end_p) { - snprintf(wps->error, 256, "\n [!] Cannot specify --start or --end if --force is selected!\n\n"); - goto usage_err; - } + if (wps->bruteforce && ((start_p != (time_t) -1) || (end_p != (time_t) -1))) { + snprintf(wps->error, 256, "\n [!] Cannot specify --start or --end if --force is selected!\n\n"); + goto usage_err; } if (wps->mode_auto) { /* Mode auto */ @@ -337,8 +336,8 @@ usage_err: wps->end = t_now.tv_sec - MODE3_DAYS * SEC_PER_DAY; /* Attributes --start and --end can be switched start > end or end > start */ - if (start_p) { - if (end_p) { + if (start_p != (time_t) -1) { + if (end_p != (time_t) -1) { /* Attributes --start and --end must be different */ if (start_p == end_p) { @@ -361,7 +360,7 @@ usage_err: } } } else { - if (end_p) { + if (end_p != (time_t) -1) { if (end_p >= wps->start) { snprintf(wps->error, 256, "\n [!] Bad Ending point!\n\n"); goto usage_err; @@ -589,14 +588,14 @@ usage_err: { struct tm ts; char buffer[30]; - ts = *localtime(&wps->start); + ts = *gmtime(&wps->start); strftime(buffer, 30, "%c", &ts); - printf("\n [DEBUG] %s:%d:%s(): Start: %10ld (%s)", - __FILE__, __LINE__, __func__, (long) wps->start, buffer); - ts = *localtime(&wps->end); + printf("\n [DEBUG] %s:%d:%s(): Start: %10lu (%s UTC)", + __FILE__, __LINE__, __func__, (unsigned long) wps->start, buffer); + ts = *gmtime(&wps->end); strftime(buffer, 30, "%c", &ts); - printf("\n [DEBUG] %s:%d:%s(): End: %10ld (%s)", - __FILE__, __LINE__, __func__, (long) wps->end, buffer); + printf("\n [DEBUG] %s:%d:%s(): End: %10lu (%s UTC)", + __FILE__, __LINE__, __func__, (unsigned long) wps->end, buffer); fflush(stdout); } #endif @@ -812,9 +811,9 @@ usage_err: char buffer[30]; seed_time = print_seed; - ts = *localtime(&seed_time); + ts = *gmtime(&seed_time); strftime(buffer, 30, "%c", &ts); - printf(" (%s)", buffer); + printf(" (%s UTC)", buffer); } } } diff --git a/src/utils.h b/src/utils.h index 0bff934..175e853 100644 --- a/src/utils.h +++ b/src/utils.h @@ -74,11 +74,43 @@ int get_int(char *in, int *out) { return 0; }; +/* Custom timegm function made by Eric S Raymond */ +time_t c_timegm(register struct tm *t) { + register long year; + register time_t result; + + #define MONTHS_PER_YEAR 12 /* Months per calendar year */ + + static const int cumdays[MONTHS_PER_YEAR] = + { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }; + + year = 1900 + t->tm_year + t->tm_mon / MONTHS_PER_YEAR; + result = (year - 1970) * 365 + cumdays[t->tm_mon % MONTHS_PER_YEAR]; + result += (year - 1968) / 4; + result -= (year - 1900) / 100; + result += (year - 1600) / 400; + if ((year % 4) == 0 && ((year % 100) != 0 || (year % 400) == 0) && + (t->tm_mon % MONTHS_PER_YEAR) < 2) { + result--; + } + result += t->tm_mday - 1; + result *= 24; + result += t->tm_hour; + result *= 60; + result += t->tm_min; + result *= 60; + result += t->tm_sec; + if (t->tm_isdst == 1) + result -= 3600; + + return result; +} + /* Converts a [mm/]yyyy string to Unix date time */ unsigned int get_unix_datetime(char *s, time_t *datetime) { unsigned int len = strlen(s); int month = 0, year; - struct tm tm; + struct tm t; if (len == 4) { if (get_int(s, &year)) @@ -106,18 +138,20 @@ unsigned int get_unix_datetime(char *s, time_t *datetime) { if (get_int(s_month, &month) || get_int(s_year, &year)) return 1; + if ((year < 1970 && year > 2037) || (month < 1 && month > 12)) + return 1; } else { return 1; } - tm.tm_sec = 0; - tm.tm_min = 0; - tm.tm_hour = 0; - tm.tm_mday = 1; - tm.tm_mon = month - 1; - tm.tm_year = year - 1900; - tm.tm_isdst = -1; - *datetime = mktime(&tm); + t.tm_sec = 0; + t.tm_min = 0; + t.tm_hour = 0; + t.tm_mday = 1; + t.tm_mon = month - 1; + t.tm_year = year - 1900; + t.tm_isdst = 0; + *datetime = c_timegm(&t); if (*datetime < 0) return 1;