From 1b1796df3a4292067a174faa11b1a852f79e98e3 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Fri, 23 Aug 2019 11:12:31 +0100 Subject: [PATCH] [3.7] bpo-37915: Fix comparison between tzinfo objects and timezone objects (GH-15390) (GH-15417) https://bugs.python.org/issue37915 Automerge-Triggered-By: @pablogsal. (cherry picked from commit 4be11c009abe88175fa164b45e4838e7267dfa97) Co-authored-by: Pablo Galindo --- Lib/test/datetimetester.py | 5 +++++ .../next/Library/2019-08-22-16-13-27.bpo-37915.xyoZI5.rst | 3 +++ Modules/_datetimemodule.c | 4 +++- 3 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2019-08-22-16-13-27.bpo-37915.xyoZI5.rst diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py index 025e71de7872..0c621f0f47c7 100644 --- a/Lib/test/datetimetester.py +++ b/Lib/test/datetimetester.py @@ -413,6 +413,11 @@ class TestTimeZone(unittest.TestCase): with self.assertRaises(ValueError): timezone(delta) + def test_comparison_with_tzinfo(self): + # Constructing tzinfo objects directly should not be done by users + # and serves only to check the bug described in bpo-37915 + self.assertNotEqual(timezone.utc, tzinfo()) + self.assertNotEqual(timezone(timedelta(hours=1)), tzinfo()) ############################################################################# # Base class for testing a particular aspect of timedelta, time, date and diff --git a/Misc/NEWS.d/next/Library/2019-08-22-16-13-27.bpo-37915.xyoZI5.rst b/Misc/NEWS.d/next/Library/2019-08-22-16-13-27.bpo-37915.xyoZI5.rst new file mode 100644 index 000000000000..1dc9ea4b8cf8 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-08-22-16-13-27.bpo-37915.xyoZI5.rst @@ -0,0 +1,3 @@ +Fix a segmentation fault that appeared when comparing instances of +``datetime.timezone`` and ``datetime.tzinfo`` objects. Patch by Pablo +Galindo. diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index 655be364d9cb..6bed29ee5cf3 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -20,6 +20,8 @@ #include "datetime.h" #undef Py_BUILD_CORE +#define PyTimezone_Check(op) PyObject_TypeCheck(op, &PyDateTime_TimeZoneType) + /*[clinic input] module datetime class datetime.datetime "PyDateTime_DateTime *" "&PyDateTime_DateTimeType" @@ -3648,7 +3650,7 @@ timezone_richcompare(PyDateTime_TimeZone *self, { if (op != Py_EQ && op != Py_NE) Py_RETURN_NOTIMPLEMENTED; - if (!PyTZInfo_Check(other)) { + if (!PyTimezone_Check(other)) { Py_RETURN_NOTIMPLEMENTED; } return delta_richcompare(self->offset, other->offset, op); -- 2.47.3