diff -r 1ff29b57628e Lib/contextlib.py --- a/Lib/contextlib.py Wed Dec 02 14:37:35 2015 +0100 +++ b/Lib/contextlib.py Wed Dec 02 14:59:08 2015 -0500 @@ -320,6 +320,8 @@ frame_exc = sys.exc_info()[1] def _fix_exception_context(new_exc, old_exc): # Context may not be correct, so find the end of the chain + if new_exc is old_exc: + return while 1: exc_context = new_exc.__context__ if exc_context is old_exc: diff -r 1ff29b57628e Lib/test/test_contextlib.py --- a/Lib/test/test_contextlib.py Wed Dec 02 14:37:35 2015 +0100 +++ b/Lib/test/test_contextlib.py Wed Dec 02 14:59:08 2015 -0500 @@ -762,6 +762,21 @@ stack.push(cm) self.assertIs(stack._exit_callbacks[-1], cm) + def test_context_cycle(self): + # Fixes behaviour discovered in issue #25779. + @contextmanager + def generator_context_manager(): + yield None + + def main(): + es = ExitStack() + with es: + es.enter_context(generator_context_manager()) + raise RuntimeError + + with self.assertRaises(RuntimeError): + main() + class TestRedirectStream: