python / python/cpython

TemporaryDirectory ignore_cleanup_errors flag is not robustic

Ouverte
#135,812 3 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

stdlib type-bug
Langage dominant
Python
Étoiles
77.2k
Forks
35.9k
Métriques de merge des PR
Métriques de PR en attente

Description

Bug report

Bug description:

When using ignore_cleanup_errors flag in TemporaryDirectory context manager, there's a path that will raise an issue.

In the onerror function that's being called when error in rmtree function:
If the first error is FileNotFound, pass
If it's everything else, check the ignore_errors flag, and raise if set to False
if the error was PermissionsError first try to change the permissions (the call to _resetperms , and then try to remove the files again. But the the call to resetparams is in an outer try, which is a lot weaker, and catching only the FileNotFoundError . But in our case, this very call raised PermissionError (yet again). It was not caught and raised back to our code.

Internal logs

2025-06-16 08:07:41 - ERROR - failed to solve strawman_local_enumeration: [Errno 1] Operation not permitted: '/tmp/tmpsrelpq9p/__pycache__'
Traceback (most recent call last):
  File "/opt/hostedtoolcache/Python/3.11.8/x64/lib/python3.11/shutil.py", line 701, in _rmtree_safe_fd
    os.unlink(entry.name, dir_fd=topfd)
PermissionError: [Errno 13] Permission denied: 'main.cpython-310.pyc'


During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/runner/work/CTF/CTF/src/solvers/solvers/solve_remote/solve_remote.py", line 212, in solve_remote_single
    return solve_challenge_on_local_solver(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

...

 File "/opt/hostedtoolcache/Python/3.11.8/x64/lib/python3.11/tempfile.py", line 287, in _resetperms
    _dont_follow_symlinks(_os.chmod, path, 0o700)
  File "/opt/hostedtoolcache/Python/3.11.8/x64/lib/python3.11/tempfile.py", line 278, in _dont_follow_symlinks
    func(path, *args)
PermissionError: [Errno 1] Operation not permitted: '/tmp/tmpsrelpq9p/__pycache__'
CPython versions tested on:

3.11

Operating systems tested on:

macOS, Linux

Linked PRs
  • gh-150696

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par _resetperms de tempfile.py et le chemin de nettoyage de TemporaryDirectory, puis comparez-le avec la gestion de onerror de shutil.rmtree. Reproduisez le cas PermissionError avec Python 3.11 sur macOS ou Linux et ajoutez un test de régression montrant que ignore_cleanup_errors empêche l'échec du nettoyage de se propager.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
python
Domaine
operating-systems
Type d'issue
Bug
Difficulté
3/5
Temps estimé
1-2 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
25/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.