summaryrefslogtreecommitdiffstats
path: root/Modules/_datetimemodule.c
diff options
context:
space:
mode:
authorAmmar Askar <ammar_askar@hotmail.com>2018-07-25 16:54:58 (GMT)
committerAlexander Belopolsky <abalkin@users.noreply.github.com>2018-07-25 16:54:58 (GMT)
commit96d1e69a12ed8ab80203277e1abdaf573457a964 (patch)
treee6cdbe9b8eec222ba25cf313c0ba4361f2dd68d9 /Modules/_datetimemodule.c
parent74102c9a5f2327c4fc47feefa072854a53551d1f (diff)
downloadcpython-96d1e69a12ed8ab80203277e1abdaf573457a964.zip
cpython-96d1e69a12ed8ab80203277e1abdaf573457a964.tar.gz
cpython-96d1e69a12ed8ab80203277e1abdaf573457a964.tar.bz2
bpo-29097: Forego fold detection on windows for low timestamp values (GH-2385)
On Windows, passing a negative value to local results in an OSError because localtime_s on Windows does not support negative timestamps. Unfortunately this means that fold detection for timestamps between 0 and max_fold_seconds will result in this OSError since we subtract max_fold_seconds from the timestamp to detect a fold. However, since we know there haven't been any folds in the interval [0, max_fold_seconds) in any timezone, we can hackily just forego fold detection for this time range on Windows.
Diffstat (limited to 'Modules/_datetimemodule.c')
-rw-r--r--Modules/_datetimemodule.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c
index 31aa88d..076912d 100644
--- a/Modules/_datetimemodule.c
+++ b/Modules/_datetimemodule.c
@@ -4625,7 +4625,22 @@ datetime_from_timet_and_us(PyObject *cls, TM_FUNC f, time_t timet, int us,
second = Py_MIN(59, tm.tm_sec);
/* local timezone requires to compute fold */
- if (tzinfo == Py_None && f == _PyTime_localtime) {
+ if (tzinfo == Py_None && f == _PyTime_localtime
+ /* On Windows, passing a negative value to local results
+ * in an OSError because localtime_s on Windows does
+ * not support negative timestamps. Unfortunately this
+ * means that fold detection for time values between
+ * 0 and max_fold_seconds will result in an identical
+ * error since we subtract max_fold_seconds to detect a
+ * fold. However, since we know there haven't been any
+ * folds in the interval [0, max_fold_seconds) in any
+ * timezone, we can hackily just forego fold detection
+ * for this time range.
+ */
+#ifdef MS_WINDOWS
+ && (timet - max_fold_seconds > 0)
+#endif
+ ) {
long long probe_seconds, result_seconds, transition;
result_seconds = utc_to_seconds(year, month, day,