Referencia Zigzkit (SDK consumido)

src/safety/bounded_reader.zig

Declaraciones públicas de src/safety/bounded_reader.zig (zkit (SDK consumido)).

ImplementadoSin versión del tren todavía· generada desde apps/docs/generated/zig/zkit.json

Página generada desde zkit@zkit-0.0.0-_fk2iAa4BQCqGFKJeeY9WvMQClX5kiZQ2iOZrVsxVyyN (src/root.zig). No se edita a mano: bun run docs:gen la regenera y bun run docs:check falla si difiere.

zkit.safety.BoundedReader — cursor de lectura sobre bytes NO confiables.

Todo parser de wire o contenedor (MoQT, H3/QPACK, WebTransport, MP4, MKV, el codec de conduit y el de spire) hace lo mismo: lee enteros de ancho fijo, varints y campos con prefijo de longitud de un buffer que ha escrito un atacante. Los bugs se repiten: leer más allá del final, un len del wire que se usa sin comparar con lo que queda, un contador que reserva memoria proporcional a un número de 62 bits, un unreachable en la rama "no puede pasar" que el atacante hace pasar.

Contrato:

  • Ninguna operación lee fuera de buf, ninguna hace pánico, ninguna reserva memoria. Todo fallo es un error del conjunto Error.
  • El cursor no avanza si la lectura falla (una lectura es atómica): un parser que reintenta con más datos no ve un estado a medias.
  • sub(len) da un lector hijo acotado a len bytes (estructuras anidadas: átomos MP4, elementos EBML, frames de control): el hijo no puede leer fuera de su padre por construcción.
  • readCount(max) para contadores que dimensionan algo: por encima de max es error.LimitExceeded, antes de reservar nada.

safety.BoundedReader

type · línea 38

pub const BoundedReader = struct

Sin ///.

safety.BoundedReader.init

fn · línea 42

pub fn init(buf: []const u8) BoundedReader

Sin ///.

safety.BoundedReader.remaining

fn · línea 46

pub fn remaining(self: *const BoundedReader) usize

Sin ///.

safety.BoundedReader.isEmpty

fn · línea 50

pub fn isEmpty(self: *const BoundedReader) bool

Sin ///.

safety.BoundedReader.rest

fn · línea 55

pub fn rest(self: *const BoundedReader) []const u8

Lo que queda sin consumir (préstamo, no copia).

safety.BoundedReader.expectEnd

fn · línea 60

pub fn expectEnd(self: *const BoundedReader) Error!void

error.TrailingBytes si queda algo.

safety.BoundedReader.readBytes

fn · línea 65

pub fn readBytes(self: *BoundedReader, n: usize) Error![]const u8

n bytes prestados del buffer (sin copia).

safety.BoundedReader.readBytesLen

fn · línea 72

pub fn readBytesLen(self: *BoundedReader, n: u64) Error![]const u8

Como readBytes con n de tipo del wire (u64), comprobado.

safety.BoundedReader.skip

fn · línea 77

pub fn skip(self: *BoundedReader, n: u64) Error!void

Sin ///.

safety.BoundedReader.readByte

fn · línea 81

pub fn readByte(self: *BoundedReader) Error!u8

Sin ///.

safety.BoundedReader.peekByte

fn · línea 85

pub fn peekByte(self: *const BoundedReader) Error!u8

Sin ///.

safety.BoundedReader.readInt

fn · línea 90

pub fn readInt(self: *BoundedReader, comptime T: type, endian: std.builtin.Endian) Error!T

Sin ///.

safety.BoundedReader.sub

fn · línea 97

pub fn sub(self: *BoundedReader, len: u64) Error!BoundedReader

Lector hijo sobre los siguientes len bytes; el padre avanza len.

safety.BoundedReader.limit

fn · línea 102

pub fn limit(value: anytype, max: u64) Error!u64

Entero T del wire que dimensiona algo: LimitExceeded si > max.

safety.BoundedReader.readQuicVarint

fn · línea 112

pub fn readQuicVarint(self: *BoundedReader) Error!u62

Varint de QUIC (RFC 9000 §16): 1/2/4/8 bytes según los dos bits altos, valor de hasta 62 bits. Base de MoQT, H3 y WebTransport.

safety.BoundedReader.readQuicVarintMinimal

fn · línea 123

pub fn readQuicVarintMinimal(self: *BoundedReader) Error!u62

Como readQuicVarint pero rechaza codificaciones no mínimas (InvalidEncoding), para campos donde la especificación lo exige.

safety.BoundedReader.readQuicVarintMax

fn · línea 136

pub fn readQuicVarintMax(self: *BoundedReader, max: u64) Error!u64

Varint QUIC que dimensiona algo (longitud, contador): LimitExceeded si pasa de max, y el cursor no avanza.

safety.BoundedReader.readQuicLengthPrefixed

fn · línea 147

pub fn readQuicLengthPrefixed(self: *BoundedReader, max: u64) Error![]const u8

Campo con prefijo de longitud varint QUIC, longitud <= max.

safety.BoundedReader.EbmlVint

type · línea 156

pub const EbmlVint = struct

Sin ///.

safety.BoundedReader.readEbmlVint

fn · línea 167

pub fn readEbmlVint(self: *BoundedReader, max_len: u4) Error!EbmlVint

VINT de EBML (RFC 8794 §4): la longitud (1..8) la da el primer bit a 1 del primer byte; el marcador se quita del valor. 0x00 como primer byte es ilegal (InvalidEncoding). max_len limita la longitud (4 para IDs de elemento, 8 para tamaños).

safety.bounded_reader.Error

const · línea 25

pub const Error = error{ /// Faltan bytes: el mensaje está truncado (o llegará más tarde). EndOfStream, /// Un valor del wire no cabe en el tipo pedido. Overflow, /// Un contador/longitud supera el …

Sin ///.

safety.bounded_reader.BoundedReader

type · línea 38

pub const BoundedReader = struct

Sin ///.

safety.bounded_reader.BoundedReader.init

fn · línea 42

pub fn init(buf: []const u8) BoundedReader

Sin ///.

safety.bounded_reader.BoundedReader.remaining

fn · línea 46

pub fn remaining(self: *const BoundedReader) usize

Sin ///.

safety.bounded_reader.BoundedReader.isEmpty

fn · línea 50

pub fn isEmpty(self: *const BoundedReader) bool

Sin ///.

safety.bounded_reader.BoundedReader.rest

fn · línea 55

pub fn rest(self: *const BoundedReader) []const u8

Lo que queda sin consumir (préstamo, no copia).

safety.bounded_reader.BoundedReader.expectEnd

fn · línea 60

pub fn expectEnd(self: *const BoundedReader) Error!void

error.TrailingBytes si queda algo.

safety.bounded_reader.BoundedReader.readBytes

fn · línea 65

pub fn readBytes(self: *BoundedReader, n: usize) Error![]const u8

n bytes prestados del buffer (sin copia).

safety.bounded_reader.BoundedReader.readBytesLen

fn · línea 72

pub fn readBytesLen(self: *BoundedReader, n: u64) Error![]const u8

Como readBytes con n de tipo del wire (u64), comprobado.

safety.bounded_reader.BoundedReader.skip

fn · línea 77

pub fn skip(self: *BoundedReader, n: u64) Error!void

Sin ///.

safety.bounded_reader.BoundedReader.readByte

fn · línea 81

pub fn readByte(self: *BoundedReader) Error!u8

Sin ///.

safety.bounded_reader.BoundedReader.peekByte

fn · línea 85

pub fn peekByte(self: *const BoundedReader) Error!u8

Sin ///.

safety.bounded_reader.BoundedReader.readInt

fn · línea 90

pub fn readInt(self: *BoundedReader, comptime T: type, endian: std.builtin.Endian) Error!T

Sin ///.

safety.bounded_reader.BoundedReader.sub

fn · línea 97

pub fn sub(self: *BoundedReader, len: u64) Error!BoundedReader

Lector hijo sobre los siguientes len bytes; el padre avanza len.

safety.bounded_reader.BoundedReader.limit

fn · línea 102

pub fn limit(value: anytype, max: u64) Error!u64

Entero T del wire que dimensiona algo: LimitExceeded si > max.

safety.bounded_reader.BoundedReader.readQuicVarint

fn · línea 112

pub fn readQuicVarint(self: *BoundedReader) Error!u62

Varint de QUIC (RFC 9000 §16): 1/2/4/8 bytes según los dos bits altos, valor de hasta 62 bits. Base de MoQT, H3 y WebTransport.

safety.bounded_reader.BoundedReader.readQuicVarintMinimal

fn · línea 123

pub fn readQuicVarintMinimal(self: *BoundedReader) Error!u62

Como readQuicVarint pero rechaza codificaciones no mínimas (InvalidEncoding), para campos donde la especificación lo exige.

safety.bounded_reader.BoundedReader.readQuicVarintMax

fn · línea 136

pub fn readQuicVarintMax(self: *BoundedReader, max: u64) Error!u64

Varint QUIC que dimensiona algo (longitud, contador): LimitExceeded si pasa de max, y el cursor no avanza.

safety.bounded_reader.BoundedReader.readQuicLengthPrefixed

fn · línea 147

pub fn readQuicLengthPrefixed(self: *BoundedReader, max: u64) Error![]const u8

Campo con prefijo de longitud varint QUIC, longitud <= max.

safety.bounded_reader.BoundedReader.EbmlVint

type · línea 156

pub const EbmlVint = struct

Sin ///.

safety.bounded_reader.BoundedReader.readEbmlVint

fn · línea 167

pub fn readEbmlVint(self: *BoundedReader, max_len: u4) Error!EbmlVint

VINT de EBML (RFC 8794 §4): la longitud (1..8) la da el primer bit a 1 del primer byte; el marcador se quita del valor. 0x00 como primer byte es ilegal (InvalidEncoding). max_len limita la longitud (4 para IDs de elemento, 8 para tamaños).

safety.bounded_reader.quicVarintLen

fn · línea 182

pub fn quicVarintLen(v: u64) usize

Bytes mínimos para codificar v como varint QUIC.

safety.bounded_reader.writeQuicVarint

fn · línea 190

pub fn writeQuicVarint(out: []u8, v: u62) error{NoSpaceLeft}!usize

Codifica v (<= 2^62-1) como varint QUIC mínimo en out.

safety.BoundedReader
safety.BoundedReader.init
safety.BoundedReader.remaining
safety.BoundedReader.isEmpty
safety.BoundedReader.rest
safety.BoundedReader.expectEnd
safety.BoundedReader.readBytes
safety.BoundedReader.readBytesLen
safety.BoundedReader.skip
safety.BoundedReader.readByte
safety.BoundedReader.peekByte
safety.BoundedReader.readInt
safety.BoundedReader.sub
safety.BoundedReader.limit
safety.BoundedReader.readQuicVarint
safety.BoundedReader.readQuicVarintMinimal
safety.BoundedReader.readQuicVarintMax
safety.BoundedReader.readQuicLengthPrefixed
safety.BoundedReader.EbmlVint
safety.BoundedReader.readEbmlVint
safety.bounded_reader.Error
safety.bounded_reader.BoundedReader
safety.bounded_reader.BoundedReader.init
safety.bounded_reader.BoundedReader.remaining
safety.bounded_reader.BoundedReader.isEmpty
safety.bounded_reader.BoundedReader.rest
safety.bounded_reader.BoundedReader.expectEnd
safety.bounded_reader.BoundedReader.readBytes
safety.bounded_reader.BoundedReader.readBytesLen
safety.bounded_reader.BoundedReader.skip
safety.bounded_reader.BoundedReader.readByte
safety.bounded_reader.BoundedReader.peekByte
safety.bounded_reader.BoundedReader.readInt
safety.bounded_reader.BoundedReader.sub
safety.bounded_reader.BoundedReader.limit
safety.bounded_reader.BoundedReader.readQuicVarint
safety.bounded_reader.BoundedReader.readQuicVarintMinimal
safety.bounded_reader.BoundedReader.readQuicVarintMax
safety.bounded_reader.BoundedReader.readQuicLengthPrefixed
safety.bounded_reader.BoundedReader.EbmlVint
safety.bounded_reader.BoundedReader.readEbmlVint
safety.bounded_reader.quicVarintLen
safety.bounded_reader.writeQuicVarint