Skip to content

Commit 003625a

Browse files
committed
Fix crash in diameter_dist when Session-Id avp is shorter than 8 bytes
1 parent c388a2d commit 003625a

2 files changed

Lines changed: 19 additions & 3 deletions

File tree

lib/diameter/src/base/diameter_dist.erl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,8 @@ session_id(_, 0) -> %% give up
245245
false;
246246

247247
%% Session-Id = Command Code 263, V-bit = 0.
248-
session_id(<<263:32, 0:1, _:7, Len:24, _/binary>> = Bin, _) ->
248+
%% RFC 6733 4.2 (and RFC 3588 4.2) says that minimum avp length is 8.
249+
session_id(<<263:32, 0:1, _:7, Len:24, _/binary>> = Bin, _) when Len >= 8 ->
249250
case Bin of
250251
<<Avp:Len/binary, _/binary>> ->
251252
<<_:8/binary, Sid/binary>> = Avp,

lib/diameter/test/diameter_dist_SUITE.erl

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@
3737
end_per_suite/1,
3838

3939
%% The test cases
40-
traffic/1
40+
traffic/1,
41+
short_length_avp_crash/1
4142
]).
4243

4344
%% diameter callbacks
@@ -114,7 +115,7 @@ suite() ->
114115
[{timetrap, {seconds, 90}}].
115116

116117
all() ->
117-
[traffic].
118+
[traffic, short_length_avp_crash].
118119

119120
init_per_suite(Config) ->
120121
?DUTIL:init_per_suite(Config).
@@ -131,6 +132,20 @@ traffic(Config) ->
131132
"~n Res: ~p", [Res]),
132133
Res.
133134

135+
short_length_avp_crash(_Config) ->
136+
MalformedMsg = <<1, 0, 0, 28, %% Version=1, Length=28
137+
128, 0, 0, 1, %% Flags=Request, Command=1
138+
0, 0, 0, 0, %% Application-Id=0
139+
0, 0, 0, 1, %% Hop-by-Hop=1
140+
0, 0, 0, 1, %% End-to-End=1
141+
0, 0, 1, 7, %% AVP Code=263 (Session-Id)
142+
0, %% Flags=0 (V-bit=0)
143+
0, 0, 4>>, %% AVP Length=4 (minimum is 8)
144+
RecvData = {recvdata, undefined, name, undefined, undefined, undefined, undefined},
145+
Pkt = #diameter_packet{bin = MalformedMsg},
146+
Request = {Pkt, undefined, undefined, undefined, undefined, RecvData},
147+
148+
discard = diameter_dist:route_session(Request, #{default => discard}).
134149

135150
%% ===========================================================================
136151

0 commit comments

Comments
 (0)