Skip to content

Commit

Permalink
PER, UPER: Fix encoding/decoding of open types greater than 16K
Browse files Browse the repository at this point in the history
  • Loading branch information
bjorng committed Sep 3, 2013
1 parent df7bb30 commit c28e00b
Show file tree
Hide file tree
Showing 5 changed files with 75 additions and 2 deletions.
3 changes: 1 addition & 2 deletions lib/asn1/src/asn1ct_imm.erl
Expand Up @@ -138,8 +138,7 @@ per_dec_raw_bitstring(Constraint, Aligned) ->
dec_string(Constraint, 1, Aligned, 'BIT STRING').

per_dec_open_type(Aligned) ->
{get_bits,decode_unconstrained_length(true, Aligned),
[8,binary,{align,Aligned}]}.
dec_string(no, 8, Aligned, open_type).

per_dec_real(Aligned) ->
Dec = fun(V, Buf) ->
Expand Down
1 change: 1 addition & 0 deletions lib/asn1/test/Makefile
Expand Up @@ -82,6 +82,7 @@ MODULES= \
testInfObjectClass \
testInfObj \
testParameterizedInfObj \
testFragmented \
testMergeCompile \
testMultipleLevels \
testDeepTConstr \
Expand Down
7 changes: 7 additions & 0 deletions lib/asn1/test/asn1_SUITE.erl
Expand Up @@ -150,6 +150,7 @@ groups() ->
per_open_type,
testInfObjectClass,
testParameterizedInfObj,
testFragmented,
testMergeCompile,
testobj,
testDeepTConstr,
Expand Down Expand Up @@ -830,6 +831,12 @@ testParameterizedInfObj(Config, Rule, Opts) ->
asn1_test_lib:compile_all(Files, Config, [Rule|Opts]),
testParameterizedInfObj:main(Config, Rule).

testFragmented(Config) ->
test(Config, fun testFragmented/3).
testFragmented(Config, Rule, Opts) ->
asn1_test_lib:compile("Fragmented", Config, [Rule|Opts]),
testFragmented:main(Rule).

testMergeCompile(Config) -> test(Config, fun testMergeCompile/3).
testMergeCompile(Config, Rule, Opts) ->
Files = ["MS.set.asn", "RANAPSET.set.asn1", "Mvrasn4.set.asn",
Expand Down
24 changes: 24 additions & 0 deletions lib/asn1/test/asn1_SUITE_data/Fragmented.asn1
@@ -0,0 +1,24 @@
Fragmented DEFINITIONS AUTOMATIC TAGS ::=
BEGIN

FUNCTION ::= CLASS {
&code INTEGER UNIQUE,
&b BOOLEAN,
&ArgumentType
}

SS ::= SEQUENCE OF OCTET STRING

val1 FUNCTION ::= {
&code 1, &b FALSE, &ArgumentType SS
}

ObjSet FUNCTION ::= { val1 }

PDU ::= SEQUENCE {
code FUNCTION.&code ({ObjSet}),
b FUNCTION.&b ({ObjSet}{@code}),
arg FUNCTION.&ArgumentType ({ObjSet}{@code})
}

END
42 changes: 42 additions & 0 deletions lib/asn1/test/testFragmented.erl
@@ -0,0 +1,42 @@
%%
%% %CopyrightBegin%
%%
%% Copyright Ericsson AB 2013. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
%% compliance with the License. You should have received a copy of the
%% Erlang Public License along with this software. If not, it can be
%% retrieved online at http://www.erlang.org/.
%%
%% Software distributed under the License is distributed on an "AS IS"
%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
%% the License for the specific language governing rights and limitations
%% under the License.
%%
%% %CopyrightEnd%
%%
%%
-module(testFragmented).

-export([main/1]).

main(_Erule) ->
roundtrip('PDU', {'PDU',1,false,["abc","def"]}),
B256 = lists:seq(0, 255),
K1 = lists:duplicate(4, B256),
K8 = binary_to_list(iolist_to_binary(lists:duplicate(8, K1))),
roundtrip('PDU', {'PDU',1,false,[K8,K8]}),
roundtrip('PDU', {'PDU',1,false,[K8,K8,K8,K8]}),
roundtrip('PDU', {'PDU',1,false,[K8,K8,K8,K8,K8,K8]}),
roundtrip('PDU', {'PDU',1,false,[K8,K8,K8,K8,K8,K8,K8,K8]}),
roundtrip('PDU', {'PDU',1,false,[K8,K8,K8,K8,K8,K8,K8,K8,
K8,K8,K8,K8,K8,K8]}),
roundtrip('PDU', {'PDU',1,false,[K8,K8,K8,K8,K8,K8,K8,K8,
K8,K8,K8,K8,K8,K8,K8,K8]}),
ok.

roundtrip(T, V) ->
{ok,E} = 'Fragmented':encode(T, V),
{ok,V} = 'Fragmented':decode(T, E),
ok.

0 comments on commit c28e00b

Please sign in to comment.