From 9f2e4404374d7352a6296e287b6066ff86a604f9 Mon Sep 17 00:00:00 2001 From: Anders Svensson Date: Mon, 17 Apr 2017 16:54:54 +0200 Subject: Avoid modifying records during encode --- lib/diameter/src/base/diameter_codec.erl | 33 +++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) (limited to 'lib') diff --git a/lib/diameter/src/base/diameter_codec.erl b/lib/diameter/src/base/diameter_codec.erl index 9a7a7ad945..54f5fd2e25 100644 --- a/lib/diameter/src/base/diameter_codec.erl +++ b/lib/diameter/src/base/diameter_codec.erl @@ -665,18 +665,18 @@ pack_avp([#diameter_avp{} = Grouped | _Components]) -> %% and the list is flat, nesting being accomplished in the data %% fields. pack_avp(#diameter_avp{data = [#diameter_avp{} | _] = Components} = Grouped) -> - pack_avp(Grouped#diameter_avp{data = encode_avps(Components)}); + pack_data(encode_avps(Components), Grouped); %% Data as a type/value tuple ... pack_avp(#diameter_avp{data = {Type, Value}} = A) when is_atom(Type) -> - pack_avp(A#diameter_avp{data = diameter_types:Type(encode, Value)}); + pack_data(diameter_types:Type(encode, Value), A); %% ... with a header in various forms ... -pack_avp(#diameter_avp{data = {{_,_,_} = T, {Type, Value}}}) -> +pack_avp(#diameter_avp{data = {T, {Type, Value}}}) -> pack_avp(T, diameter_types:Type(encode, Value)); -pack_avp(#diameter_avp{data = {{_,_,_} = T, Data}}) -> +pack_avp(#diameter_avp{data = {T, Data}}) -> pack_avp(T, Data); pack_avp(#diameter_avp{data = {Dict, Name, Data}}) -> @@ -697,25 +697,28 @@ pack_avp(#diameter_avp{code = undefined, data = B}) %% ... when ignoring errors in Failed-AVP ... %% ... during a relay encode ... pack_avp(#diameter_avp{data = <<0:1, B/binary>>} = A) -> - pack_avp(A#diameter_avp{data = B}); + pack_data(B, A); %% ... or as an iolist. -pack_avp(#diameter_avp{code = Code, - vendor_id = V, - is_mandatory = M, - need_encryption = P, - data = Data}) -> - Flags = ?BIT(V /= undefined, 2#10000000) - bor ?BIT(M, 2#01000000) - bor ?BIT(P, 2#00100000), - - pack_avp(Code, Flags, V, Data). +pack_avp(#diameter_avp{data = Data} = A) -> + pack_data(Data, A). header_length(<<_:32, 1:1, _/bitstring>>) -> 12; header_length(_) -> 8. +%% pack_data/2 + +pack_data(Data, #diameter_avp{code = Code, + vendor_id = V, + is_mandatory = M, + need_encryption = P}) -> + Flags = ?BIT(V /= undefined, 2#10000000) + bor ?BIT(M, 2#01000000) + bor ?BIT(P, 2#00100000), + pack_avp(Code, Flags, V, Data). + %%% --------------------------------------------------------------------------- %%% # pack_avp/2 %%% --------------------------------------------------------------------------- -- cgit v1.2.3