Skip to content

! nothing but us reads a compressed cabinet we write #85

Description

@Hawkynt

cabextract is installed on the build machine and nothing asks it. It refuses
every compressed cabinet we write, in three different ways:

$ cabextract -t ours-mszip.cab
  A.TXT  failed (decompression error)
$ cabextract -t ours-lzx.cab
  A.TXT  failed (error in CAB data format)
$ cabextract -t ours-quantum.cab
  A.TXT  failed (out of memory)

A stored cabinet passes both readers. 7-Zip accepts our MSZIP and refuses our
LZX and Quantum, so the MSZIP case is one where the two readers disagree about
us and only the stricter one notices.

cabextract is libmspack, which is the reference implementation for all three
of these encodings, so where it and we differ the difference is ours.

Leads, untested:

  • MSZIP — each block is a raw deflate stream of its own preceded by CK,
    and the history from the previous block carries over into the next. A writer
    that emits one continuous deflate stream, or that resets the window per
    block, produces something a lenient inflater still reads and a strict one
    does not.
  • LZX — the same encoding the WIM writer had wrong (! our WIM writer produces something no WIM reader will open #76): ours is a
    dialect that round-trips against itself and nothing else. CAB, CHM and WIM
    all go through LzxCompressor, so one fix covers three formats. The WIM
    half of the evidence is in the sibling issue.
  • Quantum — "out of memory" is what libmspack reports for a window level
    it cannot make sense of; the level is packed into the high byte of the
    compression-type word beside the type itself.

The way to work these is the way #76 was worked: cabextract and 7-Zip
disagree with each other as well as with us, so both have to be asked, and a
cabinet the reference tool writes is available for comparison — gcab, or
cabextract on any cabinet already on disk. Compare one block at a time
rather than reasoning about the format from memory.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions