python / python/cpython

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

Aberta
#154,490 0 comentários 0 reações 0 responsáveis Ver no GitHub

Ninguém assumiu esta issue ainda.

stdlib type-bug
Linguagem predominante
Python
Estrelas
77.2k
Forks
36k
Métricas de merge de PRs
Métricas de PR pendentes

Descrição

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

Guia de contribuição

Abrir o guia de contribuição

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Direção de pesquisa

Comece pelo ponto de entrada ZipFile.mkdir() e inspecione como mode é sanitizado em external_attr, juntamente com o valor padrão documentado. Compare o comportamento com stat.S_IMODE e os.mkdir(); considera-se concluído quando os bits de tipo de arquivo forem excluídos e o valor padrão for mostrado como 0o777, verificando também o PR vinculado gh-154509 em busca de trabalho já em andamento.

Escrita pelo modelo de indexação a partir do texto da issue.

Avaliação

Stack de tecnologia
python
Domínio
operating-systems
Tipo de issue
Bug
Dificuldade
2/5
Tempo estimado
1-3 horas
Status de atividade
Estagnada
Clareza
Claramente especificada
Facilidade para iniciantes
25/100

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.