Browse Source

bpo-30441: Fix bug when modifying os.environ while iterating over it (#2409)

pull/2534/head
Osvaldo Santana Neto 9 years ago
committed by Serhiy Storchaka
parent
commit
8a8d28501f
  1. 4
      Lib/os.py
  2. 24
      Lib/test/test_os.py
  3. 1
      Misc/ACKS
  4. 1
      Misc/NEWS.d/next/Library/2017-06-29-14-25-14.bpo-30441.3Wh9kc.rst

4
Lib/os.py

@ -697,7 +697,9 @@ class _Environ(MutableMapping):
raise KeyError(key) from None
def __iter__(self):
for key in self._data:
# list() from dict object is an atomic operation
keys = list(self._data)
for key in keys:
yield self.decodekey(key)
def __len__(self):

24
Lib/test/test_os.py

@ -835,6 +835,30 @@ class EnvironTests(mapping_tests.BasicTestMappingProtocol):
self.assertIs(cm.exception.args[0], missing)
self.assertTrue(cm.exception.__suppress_context__)
def _test_environ_iteration(self, collection):
iterator = iter(collection)
new_key = "__new_key__"
next(iterator) # start iteration over os.environ.items
# add a new key in os.environ mapping
os.environ[new_key] = "test_environ_iteration"
try:
next(iterator) # force iteration over modified mapping
self.assertEqual(os.environ[new_key], "test_environ_iteration")
finally:
del os.environ[new_key]
def test_iter_error_when_changing_os_environ(self):
self._test_environ_iteration(os.environ)
def test_iter_error_when_changing_os_environ_items(self):
self._test_environ_iteration(os.environ.items())
def test_iter_error_when_changing_os_environ_values(self):
self._test_environ_iteration(os.environ.values())
class WalkTests(unittest.TestCase):
"""Tests for os.walk()."""

1
Misc/ACKS

@ -1088,6 +1088,7 @@ Fredrik Nehr
Tony Nelson
Trent Nelson
Andrew Nester
Osvaldo Santana Neto
Chad Netzer
Max Neunhöffer
Anthon van der Neut

1
Misc/NEWS.d/next/Library/2017-06-29-14-25-14.bpo-30441.3Wh9kc.rst

@ -0,0 +1 @@
Fix bug when modifying os.environ while iterating over it
Loading…
Cancel
Save