@@ -5515,3 +5515,164 @@ test "PackerIO: packIO convenience function" {
55155515
55165516 try expect (result .uint == 12345 );
55175517}
5518+
5519+ // ============================================================================
5520+ // ParseLimits: error path coverage for limits not exercised elsewhere
5521+ // ============================================================================
5522+
5523+ test "iterative parser: string too long" {
5524+ const custom_pack = msgpack .PackWithLimits (
5525+ * bufferType ,
5526+ * bufferType ,
5527+ bufferType .WriteError ,
5528+ bufferType .ReadError ,
5529+ bufferType .write ,
5530+ bufferType .read ,
5531+ .{ .max_string_length = 10 },
5532+ );
5533+
5534+ // str8 marker (0xd9) + length=20 + 20 bytes of zeros
5535+ var arr : [256 ]u8 = std .mem .zeroes ([256 ]u8 );
5536+ arr [0 ] = 0xd9 ;
5537+ arr [1 ] = 20 ;
5538+
5539+ var write_buffer = fixedBufferStream (& arr );
5540+ var read_buffer = fixedBufferStream (& arr );
5541+ var p = custom_pack .init (& write_buffer , & read_buffer );
5542+
5543+ const result = p .read (allocator );
5544+ try std .testing .expectError (msgpack .MsgPackError .StringTooLong , result );
5545+ }
5546+
5547+ test "iterative parser: bin too long" {
5548+ const custom_pack = msgpack .PackWithLimits (
5549+ * bufferType ,
5550+ * bufferType ,
5551+ bufferType .WriteError ,
5552+ bufferType .ReadError ,
5553+ bufferType .write ,
5554+ bufferType .read ,
5555+ .{ .max_bin_length = 10 },
5556+ );
5557+
5558+ // bin8 marker (0xc4) + length=20 + 20 bytes of zeros
5559+ var arr : [256 ]u8 = std .mem .zeroes ([256 ]u8 );
5560+ arr [0 ] = 0xc4 ;
5561+ arr [1 ] = 20 ;
5562+
5563+ var write_buffer = fixedBufferStream (& arr );
5564+ var read_buffer = fixedBufferStream (& arr );
5565+ var p = custom_pack .init (& write_buffer , & read_buffer );
5566+
5567+ const result = p .read (allocator );
5568+ try std .testing .expectError (msgpack .MsgPackError .BinDataLengthTooLong , result );
5569+ }
5570+
5571+ test "iterative parser: ext too long" {
5572+ const custom_pack = msgpack .PackWithLimits (
5573+ * bufferType ,
5574+ * bufferType ,
5575+ bufferType .WriteError ,
5576+ bufferType .ReadError ,
5577+ bufferType .write ,
5578+ bufferType .read ,
5579+ .{ .max_ext_length = 10 },
5580+ );
5581+
5582+ // ext8 marker (0xc7) + length=20 + type byte (0x01) + 20 bytes of zeros
5583+ var arr : [256 ]u8 = std .mem .zeroes ([256 ]u8 );
5584+ arr [0 ] = 0xc7 ;
5585+ arr [1 ] = 20 ;
5586+ arr [2 ] = 0x01 ;
5587+
5588+ var write_buffer = fixedBufferStream (& arr );
5589+ var read_buffer = fixedBufferStream (& arr );
5590+ var p = custom_pack .init (& write_buffer , & read_buffer );
5591+
5592+ const result = p .read (allocator );
5593+ try std .testing .expectError (msgpack .MsgPackError .ExtDataTooLarge , result );
5594+ }
5595+
5596+ test "iterative parser: map too large" {
5597+ const custom_pack = msgpack .PackWithLimits (
5598+ * bufferType ,
5599+ * bufferType ,
5600+ bufferType .WriteError ,
5601+ bufferType .ReadError ,
5602+ bufferType .write ,
5603+ bufferType .read ,
5604+ .{ .max_map_size = 10 },
5605+ );
5606+
5607+ // map16 marker (0xde) + length=1000 (0x03 0xE8 big-endian)
5608+ var arr : [16 ]u8 = std .mem .zeroes ([16 ]u8 );
5609+ arr [0 ] = 0xde ;
5610+ arr [1 ] = 0x03 ;
5611+ arr [2 ] = 0xE8 ;
5612+
5613+ var write_buffer = fixedBufferStream (& arr );
5614+ var read_buffer = fixedBufferStream (& arr );
5615+ var p = custom_pack .init (& write_buffer , & read_buffer );
5616+
5617+ const result = p .read (allocator );
5618+ try std .testing .expectError (msgpack .MsgPackError .MapTooLarge , result );
5619+ }
5620+
5621+ // ============================================================================
5622+ // Write error path: short writes from writeFn must surface as LengthWriting
5623+ // ============================================================================
5624+
5625+ const ZeroWriter = struct {
5626+ pub const WriteError = error {};
5627+ pub fn write (_ : * @This (), _ : []const u8 ) WriteError ! usize {
5628+ return 0 ;
5629+ }
5630+ };
5631+
5632+ const ShortByOneWriter = struct {
5633+ pub const WriteError = error {};
5634+ pub fn write (_ : * @This (), bytes : []const u8 ) WriteError ! usize {
5635+ if (bytes .len <= 1 ) return bytes .len ;
5636+ return bytes .len - 1 ;
5637+ }
5638+ };
5639+
5640+ test "write: zero-byte writeFn return triggers LengthWriting (writeByte path)" {
5641+ const test_pack = msgpack .Pack (
5642+ * ZeroWriter ,
5643+ * bufferType ,
5644+ ZeroWriter .WriteError ,
5645+ bufferType .ReadError ,
5646+ ZeroWriter .write ,
5647+ bufferType .read ,
5648+ );
5649+
5650+ var writer = ZeroWriter {};
5651+ var dummy : [1 ]u8 = undefined ;
5652+ var reader = fixedBufferStream (& dummy );
5653+ var p = test_pack .init (& writer , & reader );
5654+
5655+ const result = p .write (msgpack .Payload .boolToPayload (true ));
5656+ try std .testing .expectError (msgpack .MsgPackError .LengthWriting , result );
5657+ }
5658+
5659+ test "write: short multi-byte writeFn return triggers LengthWriting (writeData path)" {
5660+ const test_pack = msgpack .Pack (
5661+ * ShortByOneWriter ,
5662+ * bufferType ,
5663+ ShortByOneWriter .WriteError ,
5664+ bufferType .ReadError ,
5665+ ShortByOneWriter .write ,
5666+ bufferType .read ,
5667+ );
5668+
5669+ var writer = ShortByOneWriter {};
5670+ var dummy : [1 ]u8 = undefined ;
5671+ var reader = fixedBufferStream (& dummy );
5672+ var p = test_pack .init (& writer , & reader );
5673+
5674+ // uint32: 1-byte marker (single-byte write succeeds) + 4-byte big-endian value
5675+ // (multi-byte writeData returns N-1 -> LengthWriting).
5676+ const result = p .write (msgpack .Payload .uintToPayload (0x12345678 ));
5677+ try std .testing .expectError (msgpack .MsgPackError .LengthWriting , result );
5678+ }
0 commit comments