From f11b25b0813a1c07ddf55cca1512ef65eb97a636 Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Thu, 3 Mar 2016 22:05:36 -0800 Subject: properly use the ObjArgs variant of CallMethod in dictview binary operations (closes #26478) --- Lib/test/test_dictviews.py | 4 ++++ Misc/NEWS | 3 +++ Objects/dictobject.c | 9 ++++----- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_dictviews.py b/Lib/test/test_dictviews.py index c7714cf..5f2144a 100644 --- a/Lib/test/test_dictviews.py +++ b/Lib/test/test_dictviews.py @@ -97,6 +97,7 @@ class DictSetTest(unittest.TestCase): self.assertEqual(d1.keys() & set(d1.keys()), {'a', 'b'}) self.assertEqual(d1.keys() & set(d2.keys()), {'b'}) self.assertEqual(d1.keys() & set(d3.keys()), set()) + self.assertEqual(d1.keys() & tuple(d1.keys()), {'a', 'b'}) self.assertEqual(d1.keys() | d1.keys(), {'a', 'b'}) self.assertEqual(d1.keys() | d2.keys(), {'a', 'b', 'c'}) @@ -105,6 +106,7 @@ class DictSetTest(unittest.TestCase): self.assertEqual(d1.keys() | set(d2.keys()), {'a', 'b', 'c'}) self.assertEqual(d1.keys() | set(d3.keys()), {'a', 'b', 'd', 'e'}) + self.assertEqual(d1.keys() | (1, 2), {'a', 'b', 1, 2}) self.assertEqual(d1.keys() ^ d1.keys(), set()) self.assertEqual(d1.keys() ^ d2.keys(), {'a', 'c'}) @@ -113,6 +115,7 @@ class DictSetTest(unittest.TestCase): self.assertEqual(d1.keys() ^ set(d2.keys()), {'a', 'c'}) self.assertEqual(d1.keys() ^ set(d3.keys()), {'a', 'b', 'd', 'e'}) + self.assertEqual(d1.keys() ^ tuple(d2.keys()), {'a', 'c'}) self.assertEqual(d1.keys() - d1.keys(), set()) self.assertEqual(d1.keys() - d2.keys(), {'a'}) @@ -120,6 +123,7 @@ class DictSetTest(unittest.TestCase): self.assertEqual(d1.keys() - set(d1.keys()), set()) self.assertEqual(d1.keys() - set(d2.keys()), {'a'}) self.assertEqual(d1.keys() - set(d3.keys()), {'a', 'b'}) + self.assertEqual(d1.keys() - (0, 1), {'a', 'b'}) self.assertFalse(d1.keys().isdisjoint(d1.keys())) self.assertFalse(d1.keys().isdisjoint(d2.keys())) diff --git a/Misc/NEWS b/Misc/NEWS index f9ccc04..8db17d8 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Release date: tba Core and Builtins ----------------- +- Issue #26478: Fix semantic bugs when using binary operators with dictionary + views and tuples. + - Issue #26171: Fix possible integer overflow and heap corruption in zipimporter.get_data(). diff --git a/Objects/dictobject.c b/Objects/dictobject.c index a494d6b..25619c1 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -3394,7 +3394,7 @@ dictviews_sub(PyObject* self, PyObject *other) if (result == NULL) return NULL; - tmp = _PyObject_CallMethodId(result, &PyId_difference_update, "O", other); + tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_difference_update, other, NULL); if (tmp == NULL) { Py_DECREF(result); return NULL; @@ -3414,7 +3414,7 @@ dictviews_and(PyObject* self, PyObject *other) if (result == NULL) return NULL; - tmp = _PyObject_CallMethodId(result, &PyId_intersection_update, "O", other); + tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_intersection_update, other, NULL); if (tmp == NULL) { Py_DECREF(result); return NULL; @@ -3434,7 +3434,7 @@ dictviews_or(PyObject* self, PyObject *other) if (result == NULL) return NULL; - tmp = _PyObject_CallMethodId(result, &PyId_update, "O", other); + tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_update, other, NULL); if (tmp == NULL) { Py_DECREF(result); return NULL; @@ -3454,8 +3454,7 @@ dictviews_xor(PyObject* self, PyObject *other) if (result == NULL) return NULL; - tmp = _PyObject_CallMethodId(result, &PyId_symmetric_difference_update, "O", - other); + tmp = _PyObject_CallMethodIdObjArgs(result, &PyId_symmetric_difference_update, other, NULL); if (tmp == NULL) { Py_DECREF(result); return NULL; -- cgit v0.12