Declaraciones públicas de src/safety/bounded_reader.zig (zkit (SDK consumido)).
apps/docs/generated/zig/zkit.jsonPágina generada desde
zkit@zkit-0.0.0-_fk2iAa4BQCqGFKJeeY9WvMQClX5kiZQ2iOZrVsxVyyN (src/root.zig). No se edita a mano:bun run docs:genla regenera ybun run docs:checkfalla 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:
buf, ninguna hace pánico, ninguna
reserva memoria. Todo fallo es un error del conjunto Error.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.BoundedReadertype · línea 38
pub const BoundedReader = structSin ///.
safety.BoundedReader.initfn · línea 42
pub fn init(buf: []const u8) BoundedReaderSin ///.
safety.BoundedReader.remainingfn · línea 46
pub fn remaining(self: *const BoundedReader) usizeSin ///.
safety.BoundedReader.isEmptyfn · línea 50
pub fn isEmpty(self: *const BoundedReader) boolSin ///.
safety.BoundedReader.restfn · línea 55
pub fn rest(self: *const BoundedReader) []const u8Lo que queda sin consumir (préstamo, no copia).
safety.BoundedReader.expectEndfn · línea 60
pub fn expectEnd(self: *const BoundedReader) Error!voiderror.TrailingBytes si queda algo.
safety.BoundedReader.readBytesfn · línea 65
pub fn readBytes(self: *BoundedReader, n: usize) Error![]const u8n bytes prestados del buffer (sin copia).
safety.BoundedReader.readBytesLenfn · línea 72
pub fn readBytesLen(self: *BoundedReader, n: u64) Error![]const u8Como readBytes con n de tipo del wire (u64), comprobado.
safety.BoundedReader.skipfn · línea 77
pub fn skip(self: *BoundedReader, n: u64) Error!voidSin ///.
safety.BoundedReader.readBytefn · línea 81
pub fn readByte(self: *BoundedReader) Error!u8Sin ///.
safety.BoundedReader.peekBytefn · línea 85
pub fn peekByte(self: *const BoundedReader) Error!u8Sin ///.
safety.BoundedReader.readIntfn · línea 90
pub fn readInt(self: *BoundedReader, comptime T: type, endian: std.builtin.Endian) Error!TSin ///.
safety.BoundedReader.subfn · línea 97
pub fn sub(self: *BoundedReader, len: u64) Error!BoundedReaderLector hijo sobre los siguientes len bytes; el padre avanza len.
safety.BoundedReader.limitfn · línea 102
pub fn limit(value: anytype, max: u64) Error!u64Entero T del wire que dimensiona algo: LimitExceeded si > max.
safety.BoundedReader.readQuicVarintfn · línea 112
pub fn readQuicVarint(self: *BoundedReader) Error!u62Varint 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.readQuicVarintMinimalfn · línea 123
pub fn readQuicVarintMinimal(self: *BoundedReader) Error!u62Como readQuicVarint pero rechaza codificaciones no mínimas
(InvalidEncoding), para campos donde la especificación lo exige.
safety.BoundedReader.readQuicVarintMaxfn · línea 136
pub fn readQuicVarintMax(self: *BoundedReader, max: u64) Error!u64Varint QUIC que dimensiona algo (longitud, contador): LimitExceeded
si pasa de max, y el cursor no avanza.
safety.BoundedReader.readQuicLengthPrefixedfn · línea 147
pub fn readQuicLengthPrefixed(self: *BoundedReader, max: u64) Error![]const u8Campo con prefijo de longitud varint QUIC, longitud <= max.
safety.BoundedReader.EbmlVinttype · línea 156
pub const EbmlVint = structSin ///.
safety.BoundedReader.readEbmlVintfn · línea 167
pub fn readEbmlVint(self: *BoundedReader, max_len: u4) Error!EbmlVintVINT 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.Errorconst · 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.BoundedReadertype · línea 38
pub const BoundedReader = structSin ///.
safety.bounded_reader.BoundedReader.initfn · línea 42
pub fn init(buf: []const u8) BoundedReaderSin ///.
safety.bounded_reader.BoundedReader.remainingfn · línea 46
pub fn remaining(self: *const BoundedReader) usizeSin ///.
safety.bounded_reader.BoundedReader.isEmptyfn · línea 50
pub fn isEmpty(self: *const BoundedReader) boolSin ///.
safety.bounded_reader.BoundedReader.restfn · línea 55
pub fn rest(self: *const BoundedReader) []const u8Lo que queda sin consumir (préstamo, no copia).
safety.bounded_reader.BoundedReader.expectEndfn · línea 60
pub fn expectEnd(self: *const BoundedReader) Error!voiderror.TrailingBytes si queda algo.
safety.bounded_reader.BoundedReader.readBytesfn · línea 65
pub fn readBytes(self: *BoundedReader, n: usize) Error![]const u8n bytes prestados del buffer (sin copia).
safety.bounded_reader.BoundedReader.readBytesLenfn · línea 72
pub fn readBytesLen(self: *BoundedReader, n: u64) Error![]const u8Como readBytes con n de tipo del wire (u64), comprobado.
safety.bounded_reader.BoundedReader.skipfn · línea 77
pub fn skip(self: *BoundedReader, n: u64) Error!voidSin ///.
safety.bounded_reader.BoundedReader.readBytefn · línea 81
pub fn readByte(self: *BoundedReader) Error!u8Sin ///.
safety.bounded_reader.BoundedReader.peekBytefn · línea 85
pub fn peekByte(self: *const BoundedReader) Error!u8Sin ///.
safety.bounded_reader.BoundedReader.readIntfn · línea 90
pub fn readInt(self: *BoundedReader, comptime T: type, endian: std.builtin.Endian) Error!TSin ///.
safety.bounded_reader.BoundedReader.subfn · línea 97
pub fn sub(self: *BoundedReader, len: u64) Error!BoundedReaderLector hijo sobre los siguientes len bytes; el padre avanza len.
safety.bounded_reader.BoundedReader.limitfn · línea 102
pub fn limit(value: anytype, max: u64) Error!u64Entero T del wire que dimensiona algo: LimitExceeded si > max.
safety.bounded_reader.BoundedReader.readQuicVarintfn · línea 112
pub fn readQuicVarint(self: *BoundedReader) Error!u62Varint 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.readQuicVarintMinimalfn · línea 123
pub fn readQuicVarintMinimal(self: *BoundedReader) Error!u62Como readQuicVarint pero rechaza codificaciones no mínimas
(InvalidEncoding), para campos donde la especificación lo exige.
safety.bounded_reader.BoundedReader.readQuicVarintMaxfn · línea 136
pub fn readQuicVarintMax(self: *BoundedReader, max: u64) Error!u64Varint QUIC que dimensiona algo (longitud, contador): LimitExceeded
si pasa de max, y el cursor no avanza.
safety.bounded_reader.BoundedReader.readQuicLengthPrefixedfn · línea 147
pub fn readQuicLengthPrefixed(self: *BoundedReader, max: u64) Error![]const u8Campo con prefijo de longitud varint QUIC, longitud <= max.
safety.bounded_reader.BoundedReader.EbmlVinttype · línea 156
pub const EbmlVint = structSin ///.
safety.bounded_reader.BoundedReader.readEbmlVintfn · línea 167
pub fn readEbmlVint(self: *BoundedReader, max_len: u4) Error!EbmlVintVINT 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.quicVarintLenfn · línea 182
pub fn quicVarintLen(v: u64) usizeBytes mínimos para codificar v como varint QUIC.
safety.bounded_reader.writeQuicVarintfn · línea 190
pub fn writeQuicVarint(out: []u8, v: u62) error{NoSpaceLeft}!usizeCodifica v (<= 2^62-1) como varint QUIC mínimo en out.