aboutsummaryrefslogtreecommitdiffstats
path: root/lib/asn1/src
diff options
context:
space:
mode:
authorBjörn Gustavsson <[email protected]>2013-02-28 15:09:06 +0100
committerBjörn Gustavsson <[email protected]>2013-05-31 14:52:17 +0200
commit95af544936f9b6d7b8d03f3f49effaf5c314513d (patch)
treee77cf30cb449c76c4587dcc5e41697a7c3835add /lib/asn1/src
parent902b51b8b43fe66fd4488c7fa10c05c3b9da59b4 (diff)
downloadotp-95af544936f9b6d7b8d03f3f49effaf5c314513d.tar.gz
otp-95af544936f9b6d7b8d03f3f49effaf5c314513d.tar.bz2
otp-95af544936f9b6d7b8d03f3f49effaf5c314513d.zip
Correct encoding (decoding) of lengths less than the root range
Given the type: S ::= IA5String (SIZE (5, ...)) attempting to encode (to PER/UPER) a string shorter than 5 characters would fail. Similarly, attempting to decode such string in the BER format would fail. In the case of BER, we can do no range checks if the size constraint is extensible.
Diffstat (limited to 'lib/asn1/src')
-rw-r--r--lib/asn1/src/asn1rtt_ber.erl7
-rw-r--r--lib/asn1/src/asn1rtt_per.erl2
-rw-r--r--lib/asn1/src/asn1rtt_uper.erl2
3 files changed, 3 insertions, 8 deletions
diff --git a/lib/asn1/src/asn1rtt_ber.erl b/lib/asn1/src/asn1rtt_ber.erl
index 5fbf116747..34f246fb22 100644
--- a/lib/asn1/src/asn1rtt_ber.erl
+++ b/lib/asn1/src/asn1rtt_ber.erl
@@ -1270,12 +1270,7 @@ check_restricted_string(Val, StrLen, Range) ->
case Range of
{Lb,Ub} when StrLen >= Lb, Ub >= StrLen -> % variable length constraint
Val;
- {{Lb,_Ub},[]} when StrLen >= Lb ->
- Val;
- {{Lb,_Ub},_Ext=[Min|_]} when StrLen >= Lb; StrLen >= Min ->
- Val;
- {{Lb1,Ub1},{Lb2,Ub2}} when StrLen >= Lb1, StrLen =< Ub1;
- StrLen =< Ub2, StrLen >= Lb2 ->
+ {_,Ext} when is_list(Ext) ->
Val;
StrLen -> % fixed length constraint
Val;
diff --git a/lib/asn1/src/asn1rtt_per.erl b/lib/asn1/src/asn1rtt_per.erl
index b8971b7c33..d5952755f8 100644
--- a/lib/asn1/src/asn1rtt_per.erl
+++ b/lib/asn1/src/asn1rtt_per.erl
@@ -356,7 +356,7 @@ encode_length({Lb,Ub}=Vr, Len) when Ub =< 65535 ,Lb >= 0 -> % constrained
encode_length({Lb,_Ub}, Len) when is_integer(Lb), Lb >= 0 -> % Ub > 65535
encode_length(Len);
encode_length({{Lb,Ub}=Vr,Ext}, Len)
- when Ub =< 65535 ,Lb >= 0,Len=<Ub, is_list(Ext) ->
+ when Ub =< 65535, Lb =< Len, Len =< Ub, is_list(Ext) ->
%% constrained extensible
[0|encode_constrained_number(Vr,Len)];
encode_length({{_,_},Ext},Len) when is_list(Ext) ->
diff --git a/lib/asn1/src/asn1rtt_uper.erl b/lib/asn1/src/asn1rtt_uper.erl
index 3f362d227e..0a543ea6d7 100644
--- a/lib/asn1/src/asn1rtt_uper.erl
+++ b/lib/asn1/src/asn1rtt_uper.erl
@@ -355,7 +355,7 @@ encode_length({Lb,Ub}=Vr, Len) when Ub =< 65535, Lb >= 0 -> % constrained
encode_length({Lb,_Ub}, Len) when is_integer(Lb), Lb >= 0 -> % Ub > 65535
encode_length(Len);
encode_length({{Lb,Ub}=Vr,Ext},Len)
- when Ub =< 65535, Lb >= 0, Len =< Ub, is_list(Ext) ->
+ when Ub =< 65535, Lb =< Len, Len =< Ub, is_list(Ext) ->
%% constrained extensible
[<<0:1>>,encode_constrained_number(Vr,Len)];
encode_length({{_Lb,_Ub},Ext}, Len) when is_list(Ext) ->