summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPablo Galindo <Pablogsal@gmail.com>2019-08-22 20:24:25 +0100
committerMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2019-08-22 12:24:25 -0700
commit4be11c009abe88175fa164b45e4838e7267dfa97 (patch)
tree19f0c688af902ba0403f3c5c0d5e51b4949e66d7
parent8889627b53e1eea2e32590f1867fbb0b0fc7407f (diff)
downloadcpython-git-4be11c009abe88175fa164b45e4838e7267dfa97.tar.gz
bpo-37915: Fix comparison between tzinfo objects and timezone objects (GH-15390)
https://bugs.python.org/issue37915 Automerge-Triggered-By: @pablogsal
-rw-r--r--Lib/test/datetimetester.py5
-rw-r--r--Misc/NEWS.d/next/Library/2019-08-22-16-13-27.bpo-37915.xyoZI5.rst3
-rw-r--r--Modules/_datetimemodule.c3
3 files changed, 10 insertions, 1 deletions
diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py
index d0101c98bc..58004870a0 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 0000000000..1dc9ea4b8c
--- /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 6d28b3e511..56eaccdf17 100644
--- a/Modules/_datetimemodule.c
+++ b/Modules/_datetimemodule.c
@@ -32,6 +32,7 @@
#define PyTZInfo_Check(op) PyObject_TypeCheck(op, &PyDateTime_TZInfoType)
#define PyTZInfo_CheckExact(op) (Py_TYPE(op) == &PyDateTime_TZInfoType)
+#define PyTimezone_Check(op) PyObject_TypeCheck(op, &PyDateTime_TimeZoneType)
/*[clinic input]
module datetime
@@ -3745,7 +3746,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);