~bigbes/tarantool

tarantool-protobuf

7442ea2be09fc5d4eebd1c3fa679ff3422f405a7 — Eugene Blikh 3 months ago 0c13fd7
wire: reject illegal wire types 6/7 in decode_tag

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.
2 files changed, 6 insertions(+), 26 deletions(-)

M runtime/pb/wire.lua
M test/conformance/known_failures.txt
M runtime/pb/wire.lua => runtime/pb/wire.lua +6 -2
@@ 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


M test/conformance/known_failures.txt => test/conformance/known_failures.txt +0 -24
@@ 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