aboutsummaryrefslogtreecommitdiffstats
path: root/lib/diameter/src/base
diff options
context:
space:
mode:
authorErlang/OTP <[email protected]>2015-08-13 12:34:01 +0200
committerErlang/OTP <[email protected]>2015-08-13 12:34:01 +0200
commit82ee2c5e4828457e540834b6c66c80dedeb4cd67 (patch)
treea236edf099b9e879400127d12e9e36161c5c5c8a /lib/diameter/src/base
parente32557afa1ad7299c821c92446265daade52879a (diff)
parentf8e1d4c5fe8bc67cac092e5cb45457d223172f2a (diff)
downloadotp-82ee2c5e4828457e540834b6c66c80dedeb4cd67.tar.gz
otp-82ee2c5e4828457e540834b6c66c80dedeb4cd67.tar.bz2
otp-82ee2c5e4828457e540834b6c66c80dedeb4cd67.zip
Merge branch 'anders/diameter/grouped_decode/OTP-12879' into maint-17
* anders/diameter/grouped_decode/OTP-12879: Fix relay encode of decoded diameter_avp lists
Diffstat (limited to 'lib/diameter/src/base')
-rw-r--r--lib/diameter/src/base/diameter_codec.erl21
1 files changed, 14 insertions, 7 deletions
diff --git a/lib/diameter/src/base/diameter_codec.erl b/lib/diameter/src/base/diameter_codec.erl
index bf2fe8e7ca..2ad971a422 100644
--- a/lib/diameter/src/base/diameter_codec.erl
+++ b/lib/diameter/src/base/diameter_codec.erl
@@ -655,16 +655,23 @@ split_data(Bin, Len) ->
%% The normal case here is data as an #diameter_avp{} list or an
%% iolist, which are the cases that generated codec modules use. The
-%% other case is as a convenience in the relay case in which the
+%% other cases are a convenience in the relay case in which the
%% dictionary doesn't know about specific AVP's.
-%% Grouped AVP whose components need packing ...
-pack_avp([#diameter_avp{} = A | Avps]) ->
- pack_avp(A#diameter_avp{data = Avps});
-pack_avp(#diameter_avp{data = [#diameter_avp{} | _] = Avps} = A) ->
- pack_avp(A#diameter_avp{data = encode_avps(Avps)});
+%% Decoded Grouped AVP with decoded components: ignore components
+%% since they're already encoded in the Grouped AVP.
+pack_avp([#diameter_avp{} = Grouped | _Components]) ->
+ pack_avp(Grouped);
-%% ... data as a type/value tuple ...
+%% Grouped AVP whose components need packing. It's intentional that
+%% this isn't equivalent to [Grouped | Components]: here the
+%% components need to be encoded before wrapping with the Grouped AVP,
+%% 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)});
+
+%% 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)});