diff options
author | Shachar Snapiri <ssnapiri@paloaltonetworks.com> | 2022-06-23 13:06:11 +0300 |
---|---|---|
committer | Shachar Snapiri <ssnapiri@paloaltonetworks.com> | 2022-06-23 13:06:11 +0300 |
commit | 390ceeedbea4cd29131f9fb6f3559d118ce6d4e9 (patch) | |
tree | d8a765f4ee8903b16a2b4c2d34c02c3ce1aab491 | |
parent | bb5a45196e5f8f15fd0890f4ee5e9697671a3fe2 (diff) | |
download | croniter-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.py | 8 |
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): |