From: Juergen Perlinger Date: Wed, 24 Jun 2020 17:39:47 +0000 (+0200) Subject: [Bug 3626] (SNTP) UTC offset calculation needs dst flag X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=919ba94cba6d60cb6a0a70af9a5e7687964fedf5;p=thirdparty%2Fntp.git [Bug 3626] (SNTP) UTC offset calculation needs dst flag bk: 5ef38fe3rBM3XfizSkrIDTTXNGJI7g --- diff --git a/ChangeLog b/ChangeLog index eeceaa9f1..fcff81bc4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +--- +* [Bug 3626] (SNTP) UTC offset calculation needs dst flag + - applied patch by Gerry Garvey + --- (4.2.8p15) 2020/06/23 Released by Harlan Stenn diff --git a/sntp/utilities.c b/sntp/utilities.c index 43cd786b9..2069bc9b3 100644 --- a/sntp/utilities.c +++ b/sntp/utilities.c @@ -140,17 +140,22 @@ tv_to_str( const size_t bufsize = 48; char *buf; time_t gmt_time, local_time; - struct tm *p_tm_local; - int hh, mm, lto; + struct tm *ptm, tm_local; + int hh, mm, lto, isdst; /* * convert to struct tm in UTC, then intentionally feed * that tm to mktime() which expects local time input, to * derive the offset from UTC to local time. + * Need to retrieve dst flag from localtime first for mktime. */ gmt_time = tv->tv_sec; - local_time = mktime(gmtime(&gmt_time)); - p_tm_local = localtime(&gmt_time); + ptm = localtime(&gmt_time); + memcpy (&tm_local, ptm, sizeof(tm_local)); + isdst = ptm->tm_isdst; + ptm = gmtime(&gmt_time); + ptm->tm_isdst = isdst; + local_time = mktime(ptm); /* Local timezone offsets should never cause an overflow. Yeah. */ lto = difftime(local_time, gmt_time); @@ -161,12 +166,12 @@ tv_to_str( buf = emalloc(bufsize); snprintf(buf, bufsize, "%d-%.2d-%.2d %.2d:%.2d:%.2d.%.6d (%+03d%02d)", - p_tm_local->tm_year + 1900, - p_tm_local->tm_mon + 1, - p_tm_local->tm_mday, - p_tm_local->tm_hour, - p_tm_local->tm_min, - p_tm_local->tm_sec, + tm_local.tm_year + 1900, + tm_local.tm_mon + 1, + tm_local.tm_mday, + tm_local.tm_hour, + tm_local.tm_min, + tm_local.tm_sec, (int)tv->tv_usec, hh, mm);