Skip to content

Commit 8a8d285

Browse files
osantanaserhiy-storchaka
authored andcommitted
bpo-30441: Fix bug when modifying os.environ while iterating over it (#2409)
1 parent 85f6430 commit 8a8d285

File tree

4 files changed

+29
-1
lines changed

4 files changed

+29
-1
lines changed

Lib/os.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -697,7 +697,9 @@ def __delitem__(self, key):
697697
raise KeyError(key) from None
698698

699699
def __iter__(self):
700-
for key in self._data:
700+
# list() from dict object is an atomic operation
701+
keys = list(self._data)
702+
for key in keys:
701703
yield self.decodekey(key)
702704

703705
def __len__(self):

Lib/test/test_os.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -835,6 +835,30 @@ def test_key_type(self):
835835
self.assertIs(cm.exception.args[0], missing)
836836
self.assertTrue(cm.exception.__suppress_context__)
837837

838+
def _test_environ_iteration(self, collection):
839+
iterator = iter(collection)
840+
new_key = "__new_key__"
841+
842+
next(iterator) # start iteration over os.environ.items
843+
844+
# add a new key in os.environ mapping
845+
os.environ[new_key] = "test_environ_iteration"
846+
847+
try:
848+
next(iterator) # force iteration over modified mapping
849+
self.assertEqual(os.environ[new_key], "test_environ_iteration")
850+
finally:
851+
del os.environ[new_key]
852+
853+
def test_iter_error_when_changing_os_environ(self):
854+
self._test_environ_iteration(os.environ)
855+
856+
def test_iter_error_when_changing_os_environ_items(self):
857+
self._test_environ_iteration(os.environ.items())
858+
859+
def test_iter_error_when_changing_os_environ_values(self):
860+
self._test_environ_iteration(os.environ.values())
861+
838862

839863
class WalkTests(unittest.TestCase):
840864
"""Tests for os.walk()."""

Misc/ACKS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1088,6 +1088,7 @@ Fredrik Nehr
10881088
Tony Nelson
10891089
Trent Nelson
10901090
Andrew Nester
1091+
Osvaldo Santana Neto
10911092
Chad Netzer
10921093
Max Neunhöffer
10931094
Anthon van der Neut
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix bug when modifying os.environ while iterating over it

0 commit comments

Comments
 (0)