diff options
| author | Daniel Stutzbach <daniel@stutzbachenterprises.com> | 2010-08-24 20:49:57 +0000 | 
|---|---|---|
| committer | Daniel Stutzbach <daniel@stutzbachenterprises.com> | 2010-08-24 20:49:57 +0000 | 
| commit | 31da5b2f69d408ac2448eb04ee2892b8aa3aac79 (patch) | |
| tree | ea3f9ab6d296e9a7b265544b1244c734d967b334 | |
| parent | d8e5f2df68c85f7a26e34a57f8f3f791c30a688f (diff) | |
| download | cpython-git-31da5b2f69d408ac2448eb04ee2892b8aa3aac79.tar.gz | |
Issue 8750: Fixed MutableSet's methods to correctly handle reflexive operations, namely x -= x and x ^= x
| -rw-r--r-- | Lib/_abcoll.py | 24 | ||||
| -rw-r--r-- | Lib/test/test_collections.py | 15 | ||||
| -rw-r--r-- | Misc/NEWS | 3 | 
3 files changed, 33 insertions, 9 deletions
diff --git a/Lib/_abcoll.py b/Lib/_abcoll.py index d3e23c1e44..cac06e0825 100644 --- a/Lib/_abcoll.py +++ b/Lib/_abcoll.py @@ -321,18 +321,24 @@ class MutableSet(Set):          return self      def __ixor__(self, it: Iterable): -        if not isinstance(it, Set): -            it = self._from_iterable(it) -        for value in it: -            if value in self: -                self.discard(value) -            else: -                self.add(value) +        if it is self: +            self.clear() +        else: +            if not isinstance(it, Set): +                it = self._from_iterable(it) +            for value in it: +                if value in self: +                    self.discard(value) +                else: +                    self.add(value)          return self      def __isub__(self, it: Iterable): -        for value in it: -            self.discard(value) +        if it is self: +            self.clear() +        else: +            for value in it: +                self.discard(value)          return self  MutableSet.register(set) diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py index da80baa997..75d660d628 100644 --- a/Lib/test/test_collections.py +++ b/Lib/test/test_collections.py @@ -526,6 +526,21 @@ class TestCollectionABCs(ABCTestCase):          s = MySet([5,43,2,1])          self.assertEqual(s.pop(), 1) +    def test_issue8750(self): +        empty = WithSet() +        full = WithSet(range(10)) +        s = WithSet(full) +        s -= s +        self.assertEqual(s, empty) +        s = WithSet(full) +        s ^= s +        self.assertEqual(s, empty) +        s = WithSet(full) +        s &= s +        self.assertEqual(s, full) +        s |= s +        self.assertEqual(s, full) +      def test_Mapping(self):          for sample in [dict]:              self.assertIsInstance(sample(), Mapping) @@ -126,6 +126,9 @@ Extensions  Library  ------- +- Issue #8750: Fixed MutableSet's methods to correctly handle +  reflexive operations, namely x -= x and x ^= x. +  - Issue #9129: smtpd.py is vulnerable to DoS attacks deriving from missing     error handling when accepting a new connection.  | 
