update
This commit is contained in:
@@ -0,0 +1,101 @@
|
||||
# P15-083 Stage0 Decision
|
||||
|
||||
Status: `GO`. G04 authorizes B27 for all three non-LZ4 codecs. The source batch
|
||||
must preserve the exact policies below and may not import the P15-062 LZ4 STOP
|
||||
rule.
|
||||
|
||||
The gate is bound to DUT BASE
|
||||
`68bbe94c44e35d53cec8ab55d007f40b01cf0502`, FreeBSD source HEAD
|
||||
`106727738dcfb6c001b46f25363b91cece970085`, erofs-utils 1.8.6, liblzma
|
||||
5.8.1, zlib 1.3.1, and libzstd 1.5.7.
|
||||
|
||||
## Authoritative Run
|
||||
|
||||
The gate ran from `/work/erofs-freebsd-pre` as:
|
||||
|
||||
```sh
|
||||
timeout -k 10 240 repo-pre-15/tests/pre15/gates/P15-083.sh \
|
||||
--base 68bbe94c44e35d53cec8ab55d007f40b01cf0502 \
|
||||
--output planning/pre15/evidence/20260815T142600Z-G04-P15-083/gate-output
|
||||
```
|
||||
|
||||
It returned 0 and recorded `GO`. Evidence is rooted at
|
||||
`planning/pre15/evidence/20260815T142600Z-G04-P15-083/`. The authoritative
|
||||
script SHA-256 is
|
||||
`6847541266b0668ad12442ffb54b67a772a29ed8ebe6fba0e1e25214db16b2c2`, the
|
||||
input SHA-256 is
|
||||
`b3c71b4ae03c6f9511246813952aab3178a1451433ece96f04562ec7cc6c1d1e`, and
|
||||
the result SHA-256 is
|
||||
`b9431b3819d64cdf940dff05ce7bc0e0bdf44c3ec647c90592052af5f7b3e544`.
|
||||
|
||||
## Decision Rule
|
||||
|
||||
P15-083 is GO only if LZMA, Deflate, and Zstd each have a reproducible real
|
||||
EROFS fixture, an independent consumed-byte oracle, and a codec-specific policy
|
||||
that distinguishes EROFS leading zero padding from unread nonzero bytes. Any
|
||||
missing codec oracle, legal image rejected by the proposed full-stream policy,
|
||||
or inability to distinguish trailing garbage makes the whole candidate STOP.
|
||||
|
||||
## Reproducible Corpus
|
||||
|
||||
erofs-utils 1.8.6 twice generates each fixed-time, fixed-UUID, root-owned,
|
||||
xattr-free image from the same 151,552-byte source. Matching fsck extraction
|
||||
reconstructs the complete source. The image hashes are:
|
||||
|
||||
| Codec | Image SHA-256 | Selected real extent | Leading zero padding | Stream |
|
||||
|---|---|---:|---:|---:|
|
||||
| LZMA | `c26cf15844fe45a21a746bacbad2ef551c683bb9b2538de7a7eced37d8eadff9` | 4,096 + 4,096 | 3,556 | 540 |
|
||||
| Deflate | `39455150c3e999bb7ae6c36402c15a408a5679726b6d099e7d121e009ef43af6` | 28,672 + 4,096 | 1,479 | 2,617 |
|
||||
| Zstd | `b905803f0e08500cc3c6cfe07a95fe027859165acae19ca8865856af256f32ca` | 4,096 + 4,096 | 1,092 | 3,004 |
|
||||
|
||||
The leading zero bytes are legal EROFS pcluster padding. They are removed by
|
||||
the common dispatch before the codec callback, matching Linux
|
||||
`z_erofs_fixup_insize()`. Every remaining legal stream reaches the format end,
|
||||
consumes every byte, reproduces the selected logical extent, and leaves its
|
||||
output guards intact.
|
||||
|
||||
## Per-Codec Policy
|
||||
|
||||
- Deflate: a full raw stream must reach `Z_STREAM_END` with no unread input.
|
||||
The independent zlib decoder consumes 2,617 of 2,625 bytes after an 8-byte
|
||||
nonzero tail and reproduces the output. fsck also accepts that mutation, as
|
||||
does the Linux streaming loop when output is already full, but the bytes are
|
||||
not EROFS leading padding and no mkfs fixture emits them. The audited FreeBSD
|
||||
full policy rejects them with positive `EINTEGRITY` (97).
|
||||
- LZMA: MicroLZMA stores no end marker and requires an exact compressed size.
|
||||
The legal 540-byte stream consumes all bytes. Adding the same tail produces
|
||||
liblzma status 9 after consuming 540 of 548 bytes; fsck rejects it and the
|
||||
FreeBSD policy returns 97.
|
||||
- Zstd: exactly one frame must finish with no unread input. The library finds
|
||||
frame end after 3,004 of 3,012 bytes with the tail present; fsck rejects the
|
||||
source-size mismatch and the FreeBSD policy returns 97. A concatenated or
|
||||
skippable second frame is not EROFS pcluster padding.
|
||||
|
||||
This is deliberately codec-specific. It aligns Linux's non-LZ4 leading-padding
|
||||
placement and stream completion semantics without copying the Linux wrappers'
|
||||
implicit unread-byte acceptance into the FreeBSD provider path.
|
||||
|
||||
## Partial, Corruption, and Cleanup
|
||||
|
||||
The independent libraries decode real-stream prefixes that match the full
|
||||
slice: Deflate produces 3,587 bytes after consuming 715, LZMA produces 4,096
|
||||
after consuming 352, and Zstd produces 4,096 after consuming 1,457. Replacing
|
||||
the final 64 stream bytes with zero begins strictly after each partial
|
||||
consumption boundary. The same partial request still succeeds and matches;
|
||||
full decode and fsck both fail for all three codecs, with the audited FreeBSD
|
||||
policy mapping the full failure to 97. Removing the final compressed byte also
|
||||
returns 97 for all three.
|
||||
|
||||
Every library path reports cleanup complete and unchanged guards. Frozen
|
||||
`zdata.c` releases metadata or physical input after the callback, frees failed
|
||||
decoded output, and publishes only successful output. The owned temporary tree
|
||||
was removed. QEMU, protected PID 26318, port 9222, and the shared base image
|
||||
were not touched. The full feature suite was not run.
|
||||
|
||||
## Consequence
|
||||
|
||||
B27 may now make these three existing policies explicit in the exact planned
|
||||
write set and add TC176 host/QEMU coverage. It must preserve positive FreeBSD
|
||||
errno, optional Zstd ABI, provider/GEOM ownership, input release, failed-output
|
||||
free, and successful-output lifetime. The generated images, extracted files,
|
||||
oracle source, and oracle binary remain temporary and are not committed.
|
||||
Reference in New Issue
Block a user