From 2b67b4a85a82131dae5913a5b455fd4211fdb742 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 30 Apr 2025 05:52:24 +0530 Subject: [PATCH] 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)) --- src/calibre/ptempfile.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/calibre/ptempfile.py b/src/calibre/ptempfile.py index 5eea8aa9a9..73deaea739 100644 --- a/src/calibre/ptempfile.py +++ b/src/calibre/ptempfile.py @@ -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