Improper sanitization and documentation for `ZipFile.mkdir(mode)`
Ninguém assumiu esta issue ainda.
- 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
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- 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