fix(pyinstaller): retain colliding archive observations

Keep source-distinct CArchive rows and decoded PYZ children in inventory. Refuse only when extraction reaches a destination conflict.

Fixes #6674
This commit is contained in:
morluto
2026-10-23 21:03:57 +08:00
parent c4a59101ac
commit 5bcf71c660
7 changed files with 213 additions and 29 deletions
+9 -1
View File
@@ -18,6 +18,13 @@ path rules; the source name retains its spelling, including backslashes.
the decoded PYZ image for PYZ rows. A CArchive directory record starts at
`archive_start + toc_offset + directory_record_offset`; its size is
`directory_record_size`. PYZ row directory extents remain unknown.
CArchive type `b` retains PyInstaller's executable-member declaration in the
generic `executable` fact; type `x` remains non-executable. This comes from the
archive type code, not the filename or member contents.
Distinct CArchive rows retain their table-index identities even when they
share a logical path. Inventory can preserve both a file and a decoded PYZ
directory at that path, including the PYZ children; extraction refuses a
destination conflict instead of silently omitting those children.
Namespace packages remain metadata declarations at their projected query path;
they do not claim a destination directory. Their `relative_offset` and
@@ -105,7 +112,8 @@ returns a resource failure.
Supported final Python bytecode magic values cover Python 3.7 through 3.14.
Supported marshal directory values are lists, tuples, strings, integers and
bytes. Directory values follow the identified CPython marshal semantics; for
bytes, including interned Unicode strings used for module names. Directory
values follow the identified CPython marshal semantics; for
example, a long integer with a zero most-significant digit is malformed and is
not normalized into a valid table value. An unsupported magic or malformed or
unsupported directory stays an opaque member with a limitation and