python / python/cpython

pathlib.Path.copy() can copy a directory into itself via absolute paths or symlinks

Aperta
#154,690 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

stdlib type-bug
Lingua principale
Python
Stelle
77.2k
Fork
35.9k
Metriche di merge delle PR
Metriche PR in attesa

Descrizione

Bug report

Bug description:

Bug report

Path.copy() guards against copying a directory into itself with ensure_distinct_paths(), but the check is lexical only. Relative vs absolute paths and symlink aliases bypass it.

from pathlib import Path
import os

Path('src').mkdir()
(Path('src') / 'f').write_text('hello')

Path('src').copy('src/nested')  # OSError - OK

Path('src').copy(Path('src').resolve() / 'nested')  # succeeds - copies into itself

os.symlink('src', 'link')
Path('src').copy('link/nested')  # also succeeds

Same class of bug as gh-149835 that was fixed with `realpath`, but `pathlib` still uses a lexical comparison.

### CPython versions tested on:

CPython main branch

### Operating systems tested on:

Linux

<!-- gh-linked-prs -->
### Linked PRs
* gh-154689
<!-- /gh-linked-prs -->

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Direzione di ricerca

Inizia da pathlib.Path.copy() e dal relativo controllo ensure_distinct_paths(), quindi riproduci su Linux gli esempi dell’issue con percorsi assoluti e symlink. Il lavoro è completato quando entrambi gli alias vengono rifiutati perché tentano di copiare una directory dentro se stessa, mentre il comportamento esistente con i percorsi relativi continua a essere coperto; esamina il PR collegato gh-154689 per il lavoro già in corso.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
python
Ambito
operating-systems
Tipo di issue
Bug
Difficoltà
3/5
Tempo stimato
1-2 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
35/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.