From 7442ea2be09fc5d4eebd1c3fa679ff3422f405a7 Mon Sep 17 00:00:00 2001 From: Eugene Blikh Date: Sat, 16 May 2026 00:15:51 +0300 Subject: [PATCH] wire: reject illegal wire types 6/7 in decode_tag MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Wire types 6 and 7 are never assigned in the protobuf wire format; only 0 (VARINT), 1 (I64), 2 (LEN), 3/4 (SGROUP/EGROUP, proto2-only), and 5 (I32) are valid. skip_field already rejected them for unknown fields, but the decode loop in codec.lua and inline.go dispatched to a typed reader whenever the field ID was known — the reader ignored wt and called the value-specific decoder anyway, accepting bytes that should have been a parse error. Moves the check into decode_tag so every parser path — codec, generated inline code, lazy, and map sub-fields — rejects 6/7 uniformly. Drops 24 entries from test/conformance/known_failures.txt. --- runtime/pb/wire.lua | 8 ++++++-- test/conformance/known_failures.txt | 24 ------------------------ 2 files changed, 6 insertions(+), 26 deletions(-) diff --git a/runtime/pb/wire.lua b/runtime/pb/wire.lua index 62e82c4a489a821201ed9a450c35096f6ddb1e70..a6150a66aa4ecc5b0c98d604106b497b0c73ceda 100644 --- a/runtime/pb/wire.lua +++ b/runtime/pb/wire.lua @@ -138,11 +138,15 @@ local function decode_tag(buf, pos) local b = buf:byte(pos) if b == nil then error("truncated varint at offset " .. pos, 0) end if b < 0x80 then - return bit.rshift(b, 3), bit.band(b, 7), pos + 1 + local wt = bit.band(b, 7) + if wt >= 6 then error("illegal wire type " .. wt, 0) end + return bit.rshift(b, 3), wt, pos + 1 end local v, npos = decode_varint(buf, pos) v = tonumber(v) - return bit.rshift(v, 3), bit.band(v, 7), npos + local wt = bit.band(v, 7) + if wt >= 6 then error("illegal wire type " .. wt, 0) end + return bit.rshift(v, 3), wt, npos end M.decode_tag = decode_tag diff --git a/test/conformance/known_failures.txt b/test/conformance/known_failures.txt index 4d6465b4c719ad7ea870d5e8de65d1fd807fea59..e15f5793a5132a4e5a82340d6394ec32a927c14a 100644 --- a/test/conformance/known_failures.txt +++ b/test/conformance/known_failures.txt @@ -80,29 +80,5 @@ Required.Proto3.ProtobufInput.PrematureEofInsideUnknownValue.FLOAT Required.Proto3.ProtobufInput.PrematureEofInsideUnknownValue.SFIXED32 Required.Proto3.ProtobufInput.PrematureEofInsideUnknownValue.SFIXED64 Required.Proto3.ProtobufInput.RepeatedScalarMessageMerge.ProtobufOutput -Required.Proto3.ProtobufInput.UnknownWireType6_Field1_Version0 -Required.Proto3.ProtobufInput.UnknownWireType6_Field1_Version1 -Required.Proto3.ProtobufInput.UnknownWireType6_Field1_Version2 -Required.Proto3.ProtobufInput.UnknownWireType6_Field1_Version3 -Required.Proto3.ProtobufInput.UnknownWireType6_Field2_Version0 -Required.Proto3.ProtobufInput.UnknownWireType6_Field2_Version1 -Required.Proto3.ProtobufInput.UnknownWireType6_Field2_Version2 -Required.Proto3.ProtobufInput.UnknownWireType6_Field2_Version3 -Required.Proto3.ProtobufInput.UnknownWireType6_Field3_Version0 -Required.Proto3.ProtobufInput.UnknownWireType6_Field3_Version1 -Required.Proto3.ProtobufInput.UnknownWireType6_Field3_Version2 -Required.Proto3.ProtobufInput.UnknownWireType6_Field3_Version3 -Required.Proto3.ProtobufInput.UnknownWireType7_Field1_Version0 -Required.Proto3.ProtobufInput.UnknownWireType7_Field1_Version1 -Required.Proto3.ProtobufInput.UnknownWireType7_Field1_Version2 -Required.Proto3.ProtobufInput.UnknownWireType7_Field1_Version3 -Required.Proto3.ProtobufInput.UnknownWireType7_Field2_Version0 -Required.Proto3.ProtobufInput.UnknownWireType7_Field2_Version1 -Required.Proto3.ProtobufInput.UnknownWireType7_Field2_Version2 -Required.Proto3.ProtobufInput.UnknownWireType7_Field2_Version3 -Required.Proto3.ProtobufInput.UnknownWireType7_Field3_Version0 -Required.Proto3.ProtobufInput.UnknownWireType7_Field3_Version1 -Required.Proto3.ProtobufInput.UnknownWireType7_Field3_Version2 -Required.Proto3.ProtobufInput.UnknownWireType7_Field3_Version3 Required.Proto3.ProtobufInput.ValidDataOneof.MESSAGE.Merge.ProtobufOutput Required.Proto3.TimestampProtoNegativeNanos.JsonOutput