diff options
author | Anders Svensson <[email protected]> | 2017-08-31 00:28:05 +0200 |
---|---|---|
committer | Anders Svensson <[email protected]> | 2017-08-31 11:49:53 +0200 |
commit | 883ad0559b1a3551688866d88fa3089728e13b0c (patch) | |
tree | 64dce55d01e115e8bda5dd861d4af22c47d52f3d /lib/diameter/src/base/diameter_gen.erl | |
parent | 5c0024cd76782f67499a09f7c524845d913408fc (diff) | |
download | otp-883ad0559b1a3551688866d88fa3089728e13b0c.tar.gz otp-883ad0559b1a3551688866d88fa3089728e13b0c.tar.bz2 otp-883ad0559b1a3551688866d88fa3089728e13b0c.zip |
Fix decode of too many generic AVPs
That is, when the arity of an 'AVP' field has an upper bound. This
shouldn't happen in practice, but if an AVP is known but its name not
explicit in the message grammar then its count was confused with that
of AVPs packed into the 'AVP' field.
Diffstat (limited to 'lib/diameter/src/base/diameter_gen.erl')
-rw-r--r-- | lib/diameter/src/base/diameter_gen.erl | 22 |
1 files changed, 10 insertions, 12 deletions
diff --git a/lib/diameter/src/base/diameter_gen.erl b/lib/diameter/src/base/diameter_gen.erl index 2ef27e4b2e..2f84b2eae6 100644 --- a/lib/diameter/src/base/diameter_gen.erl +++ b/lib/diameter/src/base/diameter_gen.erl @@ -326,9 +326,14 @@ decode(Bin, Code, Vid, DataLen, Pad, M, P, Name, Mod, Fmt, Strict, Opts0, incr(Name, Code, Vid, M, Mod, Strict, Opts, AM0) -> NameT = Mod:avp_name(Code, Vid), %% {AvpName, Type} | 'AVP' - AvpName = field(NameT), - Arity = avp_arity(Name, AvpName, Mod, Opts, M), - {NameT, AvpName, Arity, incr(AvpName, Arity, Strict, AM0)}. + Field = field(NameT), %% AvpName | 'AVP' + Arity = avp_arity(Name, Field, Mod, Opts, M), + if 0 == Arity, 'AVP' /= Field -> + A = pack_arity(Name, Field, Opts, Mod, M), + {NameT, 'AVP', A, incr('AVP', A, Strict, AM0)}; + true -> + {NameT, Field, Arity, incr(Field, Arity, Strict, AM0)} + end. %% Data is a truncated header if command_code = undefined, otherwise %% payload bytes. The former is padded to the length of a header if @@ -345,9 +350,8 @@ setopts({_, Type}, Name, M, Opts) -> %% incr/4 -incr(F, A, SA, AM) - when F == 'AVP'; - A == ?ANY; +incr(_, A, SA, AM) + when A == ?ANY; A == 0; SA /= decode -> {undefined, AM}; @@ -612,12 +616,6 @@ acc2(Acc, Avp, _, _, 'AVP', 0, _, _, _) -> [Failed | Rec] = Acc, [[{rc(Avp), Avp} | Failed] | Rec]; -%% No AVP of this name: try to pack as 'AVP'. -acc2(Acc, Avp, I, Name, AvpName, 0, Strict, Mod, Opts) -> - M = Avp#diameter_avp.is_mandatory, - Arity = pack_arity(Name, AvpName, Opts, Mod, M), - acc2(Acc, Avp, I, Name, 'AVP', Arity, Strict, Mod, Opts); - %% Relaxed arities. acc2(Acc, Avp, _, _, AvpName, Arity, Strict, Mod, _) when Strict /= decode -> |