python / python/cpython

Improper sanitization and documentation for `ZipFile.mkdir(mode)`

Ouverte
#154,490 0 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 calling ZipFile.mkdir(), the user provided mode does not have the file format bits cleared, which may cause the created entry be recognized as an incorrect or unknown file format.

import io
import stat
import zipfile

with zipfile.ZipFile(io.BytesIO(), 'w') as zh:
    zh.mkdir('foo/', 0o107777)  # regular file
    zinfo = zh.getinfo('foo/')
    print(oct(stat.S_IFMT(zinfo.external_attr >> 16)))  # 0o140000 (socket file)

with zipfile.ZipFile(io.BytesIO(), 'w') as zh:
    zh.mkdir('foo/', 0o127777)  # symbolic link
    zinfo = zh.getinfo('foo/')
    print(oct(stat.S_IFMT(zinfo.external_attr >> 16)))  # 0o160000 (unknown)

Additionally, the current source code and doc for ZipFile.mkdir()'s default mode value are 511, which is identical to 0o777 but less intuitive.

Suggestion

Instead of the current sanitization:

zinfo.external_attr = ((0o40000 | mode) & 0xFFFF) << 16

we should probably sanitize the provided mode as what stat.S_IMODE does, i.e.:

zinfo.external_attr = (0o40000 | (mode & 0o7777)) << 16

We should probably also revise the source code and doc for ZipFile.mkdir()'s default mode value to 0o777, to be consistent with os.mkdir() and more intuitive.

CPython versions tested on:

3.14

Operating systems tested on:

No response

Linked PRs
  • gh-154509

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 le point d’entrée ZipFile.mkdir() et examinez comment mode est assaini dans external_attr, ainsi que la valeur par défaut documentée. Comparez le comportement avec stat.S_IMODE et os.mkdir() ; le travail est considéré comme terminé lorsque les bits de type de fichier sont exclus et que la valeur par défaut est affichée comme 0o777, tout en vérifiant le PR lié gh-154509 pour repérer le travail déjà en cours.

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é
2/5
Temps estimé
1-3 heures
Activité
À l'abandon
Clarté
Clairement spécifiée
Accessibilité débutants
25/100

Recevez les nouvelles issues par e-mail

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