From: David Reiss Date: Mon, 30 Aug 2010 22:05:58 +0000 (+0000) Subject: erlang: Verify elt/key/val when reading list/set/map X-Git-Tag: 0.5.0~105 X-Git-Url: https://source.supwisdom.com/gerrit/gitweb?a=commitdiff_plain;h=b4ab00847635ef74a8c03f6336e8378b5979c3e7;p=common%2Fthrift.git erlang: Verify elt/key/val when reading list/set/map For now, exit on a badmatch if one is wrong. git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@991000 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/lib/erl/src/thrift_protocol.erl b/lib/erl/src/thrift_protocol.erl index db7d2236..bb499ce7 100644 --- a/lib/erl/src/thrift_protocol.erl +++ b/lib/erl/src/thrift_protocol.erl @@ -135,6 +135,7 @@ read(IProto, S={struct, Structure}) when is_list(Structure) -> read(IProto0, {list, Type}) -> {IProto1, #protocol_list_begin{etype = EType, size = Size}} = read(IProto0, list_begin), + {EType, EType} = {term_to_typeid(Type), EType}, {List, IProto2} = lists:mapfoldl(fun(_, ProtoS0) -> {ProtoS1, {ok, Item}} = read(ProtoS0, Type), {Item, ProtoS1} @@ -145,8 +146,10 @@ read(IProto0, {list, Type}) -> {IProto3, {ok, List}}; read(IProto0, {map, KeyType, ValType}) -> - {IProto1, #protocol_map_begin{size = Size}} = + {IProto1, #protocol_map_begin{size = Size, ktype = KType, vtype = VType}} = read(IProto0, map_begin), + {KType, KType} = {term_to_typeid(KeyType), KType}, + {VType, VType} = {term_to_typeid(ValType), VType}, {List, IProto2} = lists:mapfoldl(fun(_, ProtoS0) -> {ProtoS1, {ok, Key}} = read(ProtoS0, KeyType), {ProtoS2, {ok, Val}} = read(ProtoS1, ValType), @@ -160,6 +163,7 @@ read(IProto0, {map, KeyType, ValType}) -> read(IProto0, {set, Type}) -> {IProto1, #protocol_set_begin{etype = EType, size = Size}} = read(IProto0, set_begin), + {EType, EType} = {term_to_typeid(Type), EType}, {List, IProto2} = lists:mapfoldl(fun(_, ProtoS0) -> {ProtoS1, {ok, Item}} = read(ProtoS0, Type), {Item, ProtoS1} diff --git a/test/erl/src/test_membuffer.erl b/test/erl/src/test_membuffer.erl index e576ccdb..19ac5277 100644 --- a/test/erl/src/test_membuffer.erl +++ b/test/erl/src/test_membuffer.erl @@ -74,8 +74,23 @@ t3() -> true = TestData#bools.im_false =:= Result#bools.im_false. +t4() -> + {ok, Transport} = thrift_memory_buffer:new(), + {ok, Protocol0} = thrift_binary_protocol:new(Transport), + TestData = #insanity{xtructs=[]}, + {Protocol1, ok} = thrift_protocol:write(Protocol0, + {{struct, element(2, thriftTest_types:struct_info('insanity'))}, + TestData}), + {_Protocol2, {ok, Result}} = thrift_protocol:read(Protocol1, + {struct, element(2, thriftTest_types:struct_info('insanity'))}, + 'insanity'), + + TestData = Result. + + t() -> t1(), t2(), - t3(). + t3(), + t4().