Skip to content

Commit 1a3bc55

Browse files
[3.5] bpo-30441: Fix bug when modifying os.environ while iterating over it (GH-2409). (#2557)
(cherry picked from commit 8a8d285)
1 parent 0b12107 commit 1a3bc55

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
@@ -741,7 +741,9 @@ def __delitem__(self, key):
741741
raise KeyError(key) from None
742742

743743
def __iter__(self):
744-
for key in self._data:
744+
# list() from dict object is an atomic operation
745+
keys = list(self._data)
746+
for key in keys:
745747
yield self.decodekey(key)
746748

747749
def __len__(self):

Lib/test/test_os.py

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

812+
def _test_environ_iteration(self, collection):
813+
iterator = iter(collection)
814+
new_key = "__new_key__"
815+
816+
next(iterator) # start iteration over os.environ.items
817+
818+
# add a new key in os.environ mapping
819+
os.environ[new_key] = "test_environ_iteration"
820+
821+
try:
822+
next(iterator) # force iteration over modified mapping
823+
self.assertEqual(os.environ[new_key], "test_environ_iteration")
824+
finally:
825+
del os.environ[new_key]
826+
827+
def test_iter_error_when_changing_os_environ(self):
828+
self._test_environ_iteration(os.environ)
829+
830+
def test_iter_error_when_changing_os_environ_items(self):
831+
self._test_environ_iteration(os.environ.items())
832+
833+
def test_iter_error_when_changing_os_environ_values(self):
834+
self._test_environ_iteration(os.environ.values())
835+
812836

813837
class WalkTests(unittest.TestCase):
814838
"""Tests for os.walk()."""

Misc/ACKS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1056,6 +1056,7 @@ Vilmos Nebehaj
10561056
Fredrik Nehr
10571057
Tony Nelson
10581058
Trent Nelson
1059+
Osvaldo Santana Neto
10591060
Chad Netzer
10601061
Max Neunhöffer
10611062
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)