Skip to content

Commit

Permalink
fix: raise when an invalid wire type is present
Browse files Browse the repository at this point in the history
Fix Required.Proto*.ProtobufInput.UnknownWireType*_Field*_Verion* from conformance tests
  • Loading branch information
ahamez committed Jan 14, 2025
1 parent 07173d3 commit 02a32bd
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 52 deletions.
51 changes: 1 addition & 50 deletions conformance/failure_list.txt
Original file line number Diff line number Diff line change
@@ -1,51 +1,2 @@
# TMP
Required.Proto2.ProtobufInput.UnknownOrdering.ProtobufOutput
Required.Proto2.ProtobufInput.UnknownWireType6_Field1_Verion0
Required.Proto2.ProtobufInput.UnknownWireType6_Field1_Verion1
Required.Proto2.ProtobufInput.UnknownWireType6_Field1_Verion2
Required.Proto2.ProtobufInput.UnknownWireType6_Field1_Verion3
Required.Proto2.ProtobufInput.UnknownWireType6_Field2_Verion0
Required.Proto2.ProtobufInput.UnknownWireType6_Field2_Verion1
Required.Proto2.ProtobufInput.UnknownWireType6_Field2_Verion2
Required.Proto2.ProtobufInput.UnknownWireType6_Field2_Verion3
Required.Proto2.ProtobufInput.UnknownWireType6_Field3_Verion0
Required.Proto2.ProtobufInput.UnknownWireType6_Field3_Verion1
Required.Proto2.ProtobufInput.UnknownWireType6_Field3_Verion2
Required.Proto2.ProtobufInput.UnknownWireType6_Field3_Verion3
Required.Proto2.ProtobufInput.UnknownWireType7_Field1_Verion0
Required.Proto2.ProtobufInput.UnknownWireType7_Field1_Verion1
Required.Proto2.ProtobufInput.UnknownWireType7_Field1_Verion2
Required.Proto2.ProtobufInput.UnknownWireType7_Field1_Verion3
Required.Proto2.ProtobufInput.UnknownWireType7_Field2_Verion0
Required.Proto2.ProtobufInput.UnknownWireType7_Field2_Verion1
Required.Proto2.ProtobufInput.UnknownWireType7_Field2_Verion2
Required.Proto2.ProtobufInput.UnknownWireType7_Field2_Verion3
Required.Proto2.ProtobufInput.UnknownWireType7_Field3_Verion0
Required.Proto2.ProtobufInput.UnknownWireType7_Field3_Verion1
Required.Proto2.ProtobufInput.UnknownWireType7_Field3_Verion2
Required.Proto2.ProtobufInput.UnknownWireType7_Field3_Verion3
Required.Proto3.ProtobufInput.UnknownOrdering.ProtobufOutput # Unknown field mismatch
Required.Proto3.ProtobufInput.UnknownWireType6_Field1_Verion0
Required.Proto3.ProtobufInput.UnknownWireType6_Field1_Verion1
Required.Proto3.ProtobufInput.UnknownWireType6_Field1_Verion2
Required.Proto3.ProtobufInput.UnknownWireType6_Field1_Verion3
Required.Proto3.ProtobufInput.UnknownWireType6_Field2_Verion0
Required.Proto3.ProtobufInput.UnknownWireType6_Field2_Verion1
Required.Proto3.ProtobufInput.UnknownWireType6_Field2_Verion2
Required.Proto3.ProtobufInput.UnknownWireType6_Field2_Verion3
Required.Proto3.ProtobufInput.UnknownWireType6_Field3_Verion0
Required.Proto3.ProtobufInput.UnknownWireType6_Field3_Verion1
Required.Proto3.ProtobufInput.UnknownWireType6_Field3_Verion2
Required.Proto3.ProtobufInput.UnknownWireType6_Field3_Verion3
Required.Proto3.ProtobufInput.UnknownWireType7_Field1_Verion0
Required.Proto3.ProtobufInput.UnknownWireType7_Field1_Verion1
Required.Proto3.ProtobufInput.UnknownWireType7_Field1_Verion2
Required.Proto3.ProtobufInput.UnknownWireType7_Field1_Verion3
Required.Proto3.ProtobufInput.UnknownWireType7_Field2_Verion0
Required.Proto3.ProtobufInput.UnknownWireType7_Field2_Verion1
Required.Proto3.ProtobufInput.UnknownWireType7_Field2_Verion2
Required.Proto3.ProtobufInput.UnknownWireType7_Field2_Verion3
Required.Proto3.ProtobufInput.UnknownWireType7_Field3_Verion0
Required.Proto3.ProtobufInput.UnknownWireType7_Field3_Verion1
Required.Proto3.ProtobufInput.UnknownWireType7_Field3_Verion2
Required.Proto3.ProtobufInput.UnknownWireType7_Field3_Verion3
Required.Proto3.ProtobufInput.UnknownOrdering.ProtobufOutput
5 changes: 4 additions & 1 deletion lib/protox.ex
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,10 @@ defmodule Protox do
iex> binary = <<66, 7, 8, 1, 18, 3, 102, 111, 66, 7, 8, 2, 18, 3, 98, 97, 114>>
iex> {:error, reason} = Protox.decode(binary, ProtoxExample)
iex> reason
%Protox.IllegalTagError{message: "Field with illegal tag 0"}
%Protox.DecodingError{
message: "Could not decode data (invalid wire type 7)",
binary: <<7, 8, 2, 18, 3, 98, 97, 114>>
}
"""
@doc since: "1.6.0"
@spec decode(binary(), atom()) :: {:ok, struct()} | {:error, any()}
Expand Down
8 changes: 7 additions & 1 deletion lib/protox/decode.ex
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,13 @@ defmodule Protox.Decode do
@spec parse_key(binary()) :: {non_neg_integer(), non_neg_integer(), binary()}
def parse_key(bytes) do
{key, rest} = Varint.decode(bytes)
{key >>> 3, key &&& 0b111, rest}
wire_type = key &&& 0b111

if wire_type in [@wire_32bits, @wire_64bits, @wire_delimited, @wire_varint] do
{key >>> 3, wire_type, rest}
else
raise Protox.DecodingError.new(bytes, "invalid wire type #{wire_type}")
end
end

def parse_unknown(tag, @wire_varint, bytes) do
Expand Down
13 changes: 13 additions & 0 deletions test/protox/decode_test.exs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
defmodule Protox.DecodeTest do
use ExUnit.Case

import Bitwise

alias ProtobufTestMessages.Proto3.{
NullHypothesisProto3,
TestAllTypesProto3,
Expand Down Expand Up @@ -397,6 +399,17 @@ defmodule Protox.DecodeTest do
<<0::integer-size(min_invalid_string_size)-unit(8)>>,
TestAllTypesProto3,
Protox.DecodingError
},
{
"invalid wire type",
<<
# Field | Invalid wire type
1 <<< 3 ||| 6,
# Dummy value
1
>>,
TestAllTypesProto3,
Protox.DecodingError
}
]

Expand Down

0 comments on commit 02a32bd

Please sign in to comment.