Fix for mktime() issue

Ton Voon ton.voon at opsera.com
Mon Mar 22 13:43:34 CET 2010


On 20 Mar 2010, at 01:33, Holger Weiß wrote:

> * Albrecht Dreß <albrecht.dress at arcor.de> [2010-03-18 19:29]:
>> <snip>
>>        t=localtime((time_t *)&test_time);
>>        test_time_year=t->tm_year;
>>        test_time_mon=t->tm_mon;
>>        test_time_mday=t->tm_mday;
>>        test_time_wday=t->tm_wday;
>>
>>        /* calculate the start of the day (midnight, 00:00 hours)  
>> when the specified test time occurs */
>>        t->tm_sec=0;
>>        t->tm_min=0;
>>        t->tm_hour=0;
>>        /* Removed for the moment. This fixes a bug where the  
>> timeperiod is incorrectly calculated */
>>        /* See t-tap/test_timeperiods for a test failure */
>>        /* t->tm_isdst=-1; */
>>        midnight=(unsigned long)mktime(t);
>> </snip>
>>
>> Regarding the tm_isdst field, this code "initialises" it implicitly  
>> by
>> calling localtime() but then assumes for the calculation of midnight
>> that the dst setting is still correct which may be plain wrong.
>>
>> Example: test_time is 1269734400 (Mar 28 01:00:00 2010 CET), midnight
>> will correctly be calculated as Mar 28 00:00:00 2010.  If test_time  
>> is
>> 1269763200 (Mar 28 10:00:00 2010 CEST), midnight is calculated as  
>> Mar 27
>> 23:00:00 2010 which is obviously wrong.  This miscalculation is  
>> fixed,
>> again, by properly initialising tm_isdst to -1.
>>
>> Thus, either the "tests" missed the dst change cases, or the real  
>> use of
>> midnight is not midnight but something else.
>
> The real use of the midnight value is not "12 o'clock at night," but
> "the zero point of the local time of the day," which differs from "12
> o'clock at night" if tm_isdst changed since 12 o'clock at night.  That
> is, the offset of 10:00 AM from this zero point is 36,000 seconds,
> regardless of whether tm_isdst changed since 12 o'clock at night.
>
>> In the latter case, the fix is of course to re-write the time span
>> calculation to work properly (taking into account that days may  
>> also be
>> 23 or 25 hours long, when dst changes)
>
> What makes you believe that the code in question does not work  
> properly?

Thankfully, Holger has opened my eyes to my "revert the tm_isdst=-1"  
position.

Holger said (on IRC) "there were two different cases in the code: (1)  
at most places in the code, tm_isdst was initialized just fine (by  
localtime(3)), but (2) at other places, it was indeed used  
uninitialized".

I've already fixed on occurrence of (1) (in  
check_time_against_period()), and I think I've found the other  
occurrence now (in get_next_valid_time()). This is now fixed with  
updated test cases in test_timeperiods.c. There is one particular test  
that fails at the moment which I'm not sure how to fix - any ideas  
would be appreciated (it is marked as a TODO so full tests will not  
fail).

I think all other occurrences of tm_isdst=-1 are of type (2), so I am  
not planning on reverting those anymore.

Ton

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://www.monitoring-lists.org/archive/developers/attachments/20100322/374e6d59/attachment.html>
-------------- next part --------------
------------------------------------------------------------------------------
Download Intel® Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
-------------- next part --------------
_______________________________________________
Nagios-devel mailing list
Nagios-devel at lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/nagios-devel


More information about the Developers mailing list