Skip to content

Commit cb9dc95

Browse files
committed
fix: recompute DST for daily/weekly scheduled events
- Reset tp->tm_isdst to -1 before calling mktime() when computing the next run time for NS_SCHED_DAILY and NS_SCHED_WEEKLY events. - Ensure mktime() recalculates the correct DST offset after adjusting tm_mday across day/week boundaries so daily/weekly jobs stay anchored to local wall-clock time through DST transitions. Many thanks to Brendan Graves for the report and fix!
1 parent 484e6d4 commit cb9dc95

File tree

1 file changed

+4
-0
lines changed

1 file changed

+4
-0
lines changed

nsd/sched.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -666,6 +666,8 @@ QueueEvent(Event *ePtr)
666666
if ((ePtr->flags & NS_SCHED_WEEKLY) != 0u) {
667667
tp->tm_mday -= tp->tm_wday;
668668
}
669+
/* Let mktime() recompute DST for this (possibly adjusted) date */
670+
tp->tm_isdst = -1;
669671
ePtr->nextqueue.sec = mktime(tp);
670672
ePtr->nextqueue.usec = 0;
671673
d = Ns_DiffTime(&ePtr->nextqueue, &ePtr->scheduled, NULL);
@@ -676,7 +678,9 @@ QueueEvent(Event *ePtr)
676678
d, (long)ePtr->nextqueue.sec-(long)ePtr->scheduled.sec);
677679

678680
if (d <= 0) {
681+
/* Move to next day/week and recompute DST as well. */
679682
tp->tm_mday += ((ePtr->flags & NS_SCHED_WEEKLY) != 0u) ? 7 : 1;
683+
tp->tm_isdst = -1;
680684
ePtr->nextqueue.sec = mktime(tp);
681685
ePtr->nextqueue.usec = 0;
682686
Ns_Log(Debug, "SCHED_DAILY: final next " NS_TIME_FMT ,

0 commit comments

Comments
 (0)