summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShachar Snapiri <ssnapiri@paloaltonetworks.com>2022-06-23 13:06:11 +0300
committerShachar Snapiri <ssnapiri@paloaltonetworks.com>2022-06-23 13:06:11 +0300
commit390ceeedbea4cd29131f9fb6f3559d118ce6d4e9 (patch)
treed8a765f4ee8903b16a2b4c2d34c02c3ce1aab491
parentbb5a45196e5f8f15fd0890f4ee5e9697671a3fe2 (diff)
downloadcroniter-390ceeedbea4cd29131f9fb6f3559d118ce6d4e9.tar.gz
Fix croniter_range infinite loop
The issue was caused due to the fact that the result time was adjusted unconditionally though it might have resulted in datetime that does not really exist. e.g. If the clock was moved 1 hour forward at March 27 00:00, we do not have that time, but rather March 27 01:00. If we adjust it we get March 26 23:00.
-rw-r--r--src/croniter/croniter.py8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/croniter/croniter.py b/src/croniter/croniter.py
index 16d784f..1e4b199 100644
--- a/src/croniter/croniter.py
+++ b/src/croniter/croniter.py
@@ -279,8 +279,12 @@ class croniter(object):
or (lag < 0 and
((3600 * abs(lag_hours) + abs(lag)) >= hours_before_midnight * 3600))
):
- dtresult = dtresult - datetime.timedelta(seconds=lag)
- result = self._datetime_to_timestamp(dtresult)
+ dtresult_adjusted = dtresult - datetime.timedelta(seconds=lag)
+ result_adjusted = self._datetime_to_timestamp(dtresult_adjusted)
+ # Do the actual adjust only if the result time actually exists
+ if self._timestamp_to_datetime(result_adjusted).tzinfo == dtresult_adjusted.tzinfo:
+ dtresult = dtresult_adjusted
+ result = result_adjusted
self.dst_start_time = result
self.cur = result
if issubclass(ret_type, datetime.datetime):