@@ -1714,6 +1714,33 @@ def inner():
17141714 gc_collect () # For PyPy or other GCs.
17151715 self .assertEqual (wr (), None )
17161716
1717+ def test_oserror_reinit_leak (self ):
1718+ msg = "some error message"
1719+ filename = "some filename"
1720+ filename2 = "some filename 2"
1721+
1722+ class LeakingOSError (OSError ):
1723+ def __init__ (self , code , message , filename , filename2 ):
1724+ self .strerror = message
1725+ self .filename = filename
1726+ self .filename2 = filename2
1727+ super ().__init__ (code , message , filename , None , filename2 )
1728+
1729+ refcount_msg = sys .getrefcount (msg )
1730+ refcount_filename = sys .getrefcount (filename )
1731+ refcount_filename2 = sys .getrefcount (filename2 )
1732+
1733+ for _ in range (5 ):
1734+ try :
1735+ raise LeakingOSError (1 , msg , filename , filename2 )
1736+ except OSError :
1737+ pass
1738+
1739+ gc_collect ()
1740+ self .assertEqual (sys .getrefcount (msg ), refcount_msg )
1741+ self .assertEqual (sys .getrefcount (filename ), refcount_filename )
1742+ self .assertEqual (sys .getrefcount (filename2 ), refcount_filename2 )
1743+
17171744 def test_errno_ENOTDIR (self ):
17181745 # Issue #12802: "not a directory" errors are ENOTDIR even on Windows
17191746 with self .assertRaises (OSError ) as cm :
0 commit comments