Skip to content

[spec] require an SoA record to take at least one byte - #42

Open
nebkat wants to merge 1 commit into
NeuroJSON:masterfrom
nebkat:spec/soa-record-width
Open

nebkat wants to merge 1 commit into
NeuroJSON:masterfrom
nebkat:spec/soa-record-width

Conversation

@nebkat

@nebkat nebkat commented Nov 4, 2026

Copy link
Copy Markdown
Contributor

A schema made only of zero-length fields (Z, S/H of length 0, or nested objects/arrays of those) describes records of zero bytes, so nothing in the data bounds <count>: a few bytes can declare any number of records. For example, [${U\x01aZ}#L followed by an 8-byte count is 18 bytes claiming 2^40 records, and a decoder that builds them runs effectively forever.

This is the zero-length-marker problem (nlohmann/json#2793) that already excludes T, F, Z and N from an optimized type header. This PR adds schema rule 8, under which a record's fields must total at least one byte, and a parser rejects a container whose schema doesn't, whatever its count. It also adds a sentence to the Optimized Format section pointing to the rule.

Z fields beside fields that take bytes are unaffected. Implemented in cpp-serpent.

A schema of Z fields, fixed-length S or H fields of length 0, or nested
objects and arrays of those, describes records of no bytes, so the count
is bounded by nothing in the data: a few bytes can declare any number of
records. This is the zero-length-marker problem that the optimized type
header already excludes T, F, Z and N for. Require a record's fields to
total at least one byte, and a parser to reject a container whose schema
does not, whatever its count.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant