aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjörn Gustavsson <[email protected]>2014-12-18 08:23:58 +0100
committerBjörn Gustavsson <[email protected]>2015-01-12 12:22:59 +0100
commit09cd07962f7c64ec0ccef2ad655bf9977c154bf0 (patch)
tree62b067db0fbbac22c9b65c6152cf2b983bf7c6ea
parentac5c60b0de2ef93a99f6c39f3e251f526f303964 (diff)
downloadotp-09cd07962f7c64ec0ccef2ad655bf9977c154bf0.tar.gz
otp-09cd07962f7c64ec0ccef2ad655bf9977c154bf0.tar.bz2
otp-09cd07962f7c64ec0ccef2ad655bf9977c154bf0.zip
Improve error handling for illegal object definitions
-rw-r--r--lib/asn1/src/asn1ct_check.erl23
-rw-r--r--lib/asn1/test/error_SUITE.erl11
2 files changed, 25 insertions, 9 deletions
diff --git a/lib/asn1/src/asn1ct_check.erl b/lib/asn1/src/asn1ct_check.erl
index 6cbf9614cb..99392d6eaa 100644
--- a/lib/asn1/src/asn1ct_check.erl
+++ b/lib/asn1/src/asn1ct_check.erl
@@ -705,12 +705,14 @@ check_object(S,_ObjDef,#'Object'{classname=ClassRef,def=ObjectDef}) ->
instantiate_po(S,ClassDef,Object,ArgList);
#'Externalvaluereference'{} ->
{_,Object} = get_referenced_type(S,ObjectDef),
- check_object(S, Object, object_to_check(Object));
+ check_object(S, Object, object_to_check(S, Object));
[] ->
%% An object with no fields (parsed as a value).
Def = {object,defaultsyntax,[]},
NewSettingList = check_objectdefn(S, Def, ClassDef),
- #'Object'{def=NewSettingList}
+ #'Object'{def=NewSettingList};
+ _ ->
+ asn1_error(S, illegal_object)
end,
Fields = (ClassDef#classdef.typespec)#objectclass.fields,
Gen = gen_incl(S,NewObj#'Object'.def, Fields),
@@ -973,12 +975,17 @@ traverse_seq_set_1([{'COMPONENTS OF', _} = CO0|Cs], Fun) ->
traverse_seq_set_1([], _) ->
[].
-object_to_check(#typedef{typespec=ObjDef}) ->
+object_to_check(_, #typedef{typespec=ObjDef}) ->
ObjDef;
-object_to_check(#valuedef{type=ClassName,value=ObjectRef}) ->
+object_to_check(S, #valuedef{type=Class,value=ObjectRef}) ->
%% If the object definition is parsed as an object the ClassName
- %% is parsed as a type
- #'Object'{classname=ClassName#type.def,def=ObjectRef}.
+ %% is parsed as a type.
+ case Class of
+ #type{def=#'Externaltypereference'{}=Def} ->
+ #'Object'{classname=Def,def=ObjectRef};
+ _ ->
+ asn1_error(S, illegal_object)
+ end.
check_referenced_object(S,ObjRef)
when is_record(ObjRef,'Externalvaluereference')->
@@ -1182,7 +1189,7 @@ gen_incl1(S,Fields,[C|CFields]) ->
check_object(S,TDef,TDef#typedef.typespec);
ERef ->
{_,T} = get_referenced_type(S,ERef),
- check_object(S,T,object_to_check(T))
+ check_object(S, T, object_to_check(S, T))
end,
case gen_incl(S,ObjDef#'Object'.def,
ClassFields) of
@@ -1413,7 +1420,7 @@ match_syntax_type(_S, {fixedtypevaluesetfield,Name,#type{},_}, Any) ->
{match,[{Name,Any}]};
match_syntax_type(S, {objectfield,Name,_,_,_}, #'Externalvaluereference'{}=Ref) ->
{M,Obj} = get_referenced_type(S, Ref),
- check_object(S, Obj, object_to_check(Obj)),
+ check_object(S, Obj, object_to_check(S, Obj)),
{match,[{Name,Ref#'Externalvaluereference'{module=M}}]};
match_syntax_type(S, {objectfield,Name,Class,_,_}, {object,_,_}=ObjDef) ->
InlinedObjName = list_to_atom(lists:concat([S#state.tname,
diff --git a/lib/asn1/test/error_SUITE.erl b/lib/asn1/test/error_SUITE.erl
index c6b6e9dffc..a9893b91cc 100644
--- a/lib/asn1/test/error_SUITE.erl
+++ b/lib/asn1/test/error_SUITE.erl
@@ -285,6 +285,9 @@ objects(Config) ->
" InvalidSet CL ::= { obj1 }\n"
" obj5 CL ::= {}\n"
" ErrSet ::= PT{ {PT{inst}}}\n"
+ " obj6 CL ::= 7\n"
+ " obj7 CL ::= int\n"
+ " obj8 NON-CLASS ::= { &id 1 }\n"
" CL ::= CLASS {\n"
" &code INTEGER UNIQUE,\n"
@@ -303,6 +306,9 @@ objects(Config) ->
" PT{SMALL:Small} ::= SEQUENCE { a SMALL.&code ({Small}) }\n"
" inst SMALL ::= {&code 42, &i 4711}\n"
+
+ " int INTEGER ::= 42\n"
+ " NON-CLASS ::= SEQUENCE { a BOOLEAN }\n"
"END\n">>},
{error,
[
@@ -321,7 +327,10 @@ objects(Config) ->
{missing_mandatory_fields,
['Data','Set','VarTypeValue',code,enum,object,
vartypevalue],obj5}},
- {structured_error,{M,8},asn1ct_check,invalid_objectset}
+ {structured_error,{M,8},asn1ct_check,invalid_objectset},
+ {structured_error,{M,9},asn1ct_check,illegal_object},
+ {structured_error,{M,10},asn1ct_check,illegal_object},
+ {structured_error,{M,11},asn1ct_check,illegal_object}
]
} = run(P, Config),
ok.