Skip to content

fix(archives): restore .7z content read via BytesIOFactory (#1250 #1248)#1253

Merged
FabioLeitao merged 2 commits into
mainfrom
fix/7z-bytesio-read-1250-1248
Jul 15, 2026
Merged

fix(archives): restore .7z content read via BytesIOFactory (#1250 #1248)#1253
FabioLeitao merged 2 commits into
mainfrom
fix/7z-bytesio-read-1250-1248

Conversation

@FabioLeitao

Copy link
Copy Markdown
Collaborator

Summary

Closes #1250
Closes #1248

Test plan

  • `./scripts/quick-test.sh --path tests/test_archives_scan_failures.py` (round-trip PII, multi+filters, encrypted)
  • `./scripts/check-all.sh --enforced`
  • CI green on PR
  • Bugbot review (solid extract + password path)

Made with Cursor

Replace the nonexistent SevenZipFile.read() call with a single
extract(targets=..., factory=BytesIOFactory) after list()/reset so
inner content is actually scanned and password failures classify again.

Closes #1250
Closes #1248

@cursor cursor Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale comment

Comment thread core/archives.py
@FabioLeitao

Copy link
Copy Markdown
Collaborator Author

Auditoria externa read-only (A.I.I.D.C.O.B.P.P.) — confirmação independente do achado do Bugbot sobre a interação com o budget do #1233.

Verificado contra o diff atual deste PR (commit 707549ed, branch do .7z em core/archives.py):

Confirmo o achado (HIGH) do Bugbot. No loop for member in archive.list():, a chamada a _after_examine(...) (hook do budget agregado introduzido no #1233 / merge #1243) ainda dispara return no meio da coleta. Como esse return acontece antes do extract(targets=desired, ...), se o budget estoura no membro N, todos os membros já enfileirados em desired (1..N-1) nunca são extraídos — o .7z perde tudo que já havia sido selecionado antes do teto.

Divergência de formato confirmada: nos branches ZIP/TAR, quando o budget estoura no loop, os membros lidos antes do estouro já foram materializados/yielded — o scan preserva o trabalho parcial. O novo branch 7z, com return antes do extract, descarta o trabalho parcial. Comportamento divergente entre formatos no mesmo cenário de choke do #1233 — regressão de paridade, como o Bugbot apontou.

Direção do fix (concordo com o Bugbot): trocar o return no loop de coleta por break sai da coleta mas segue para o extract(desired), processando os membros que couberam antes do estouro (o membro que estourou o budget não entra em desired). Isso restaura paridade com ZIP/TAR.

Nota de processo: este vetor (fix do .7z × budget agregado do #1233) não foi capturado nem pela auditoria de fonte interna nem por esta auditoria externa olhando o diff isoladamente — apareceu só no Bugbot, porque é um bug de interação entre o fix novo e um choke preexistente. Recomenda-se aplicar o break neste mesmo PR (correção do próprio fix, não mudança nova) e re-rodar o Bugbot antes do merge — a alteração toca justamente o caminho do budget, que merece re-verificação, não merge direto.

(Auditoria read-only: não commito, não mergeio, não aprovo — apenas registro a verificação. Merge é decisão do operador, após Bugbot verde na segunda passada.)

Use break instead of return when max_members trips during list() so
already-queued members still extract, matching ZIP/TAR parity.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant