Prevent recursion when creating base temp dir if something on system deletes the created temp dir

See #2109612 (crash on windows - RecursionError (8.3.0))
This commit is contained in:
Kovid Goyal 2025-04-30 05:52:24 +05:30
parent 9e9720c9b4
commit 2b67b4a85a
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C

View File

@ -11,6 +11,7 @@ from calibre.constants import __appname__, filesystem_encoding, get_windows_temp
from calibre.utils.safe_atexit import remove_dir, remove_file_atexit, remove_folder_atexit, unlink
_base_dir = _osx_cache_dir = None
_prevent_recursion = False
cleanup = unlink # some plugins import this function
@ -38,8 +39,8 @@ get_default_tempdir = tempfile.gettempdir
def base_dir():
global _base_dir
if _base_dir is not None and not os.path.exists(_base_dir):
global _base_dir, _prevent_recursion
if _base_dir is not None and not _prevent_recursion and not os.path.exists(_base_dir):
# Some people seem to think that running temp file cleaners that
# delete the temp dirs of running programs is a good idea!
_base_dir = None
@ -76,7 +77,12 @@ def base_dir():
base = osx_cache_dir()
_base_dir = tempfile.mkdtemp(prefix=prefix, dir=base or get_default_tempdir())
remove_folder_atexit(_base_dir)
orig = _prevent_recursion
_prevent_recursion = True
try:
remove_folder_atexit(_base_dir)
finally:
_prevent_recursion = orig
return _base_dir