From 0c1d76bf92f902073b8efa503c8115cd247af245 Mon Sep 17 00:00:00 2001 From: Micael Karlberg Date: Tue, 28 Apr 2020 17:31:26 +0200 Subject: [megaco] Mini text parser IPv6 address failure The mini decoder could handle all kinds of IPv6 addresses. The reason for this was that the som of the chars (a and e) in the short form was interpreted as 'AddToken' and 'EventsToke' respectively, which the mini parser could not handle. ABNF for the mId (only the IPv6 version): mId = (( domainAddress / domainName ) [":" portNumber]) / mtpAddress / deviceName domainAddress = "[" (IPv4address / IPv6address) "]" IPv6address = hexpart [ ":" IPv4address ] hexpart = hexseq "::" [ hexseq ] / "::" [ hexseq ] / hexseq hexseq = hex4 *( ":" hex4) hex4 = 1*4HEXDIG HEXDIG = ( DIGIT / "A" / "B" / "C" / "D" / "E" / "F" ) DIGIT = %x30-39 ; 0-9 Example: [2409:8050:5005:1243:1011::a] The final 'a' (or 'e') caused it to fail. OTP-16631 --- lib/megaco/src/text/megaco_text_mini_parser.yrl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/megaco/src/text/megaco_text_mini_parser.yrl b/lib/megaco/src/text/megaco_text_mini_parser.yrl index af3050a05b..2a4041867e 100644 --- a/lib/megaco/src/text/megaco_text_mini_parser.yrl +++ b/lib/megaco/src/text/megaco_text_mini_parser.yrl @@ -77,7 +77,7 @@ Nonterminals Terminals - %% 'AddToken' + 'AddToken' %% 'AndAUDITselectToken' 'AuditCapToken' 'AuditToken' @@ -106,7 +106,7 @@ Terminals %% 'EmergencyValueToken' 'ErrorToken' %% 'EventBufferToken' - %% 'EventsToken' + 'EventsToken' %% 'ExternalToken' 'FailoverToken' 'ForcedToken' @@ -273,7 +273,7 @@ pathName -> safeToken : ensure_pathName('$1') . safeToken -> safeToken2 : make_safe_token('$1') . -%% safeToken2 -> 'AddToken' : '$1' . +safeToken2 -> 'AddToken' : '$1' . safeToken2 -> 'AuditToken' : '$1' . safeToken2 -> 'AuditCapToken' : '$1' . safeToken2 -> 'AuditValueToken' : '$1' . @@ -298,7 +298,7 @@ safeToken2 -> 'EmbedToken' : '$1' . %% safeToken2 -> 'EmergencyOffToken' : '$1' . safeToken2 -> 'ErrorToken' : '$1' . %% safeToken2 -> 'EventBufferToken' : '$1' . -%% safeToken2 -> 'EventsToken' : '$1' . +safeToken2 -> 'EventsToken' : '$1' . %% safeToken2 -> 'ExternalToken' : '$1' . % v3 safeToken2 -> 'FailoverToken' : '$1' . safeToken2 -> 'ForcedToken' : '$1' . -- cgit v1.2.1 From 732d74645988a658765e2f548a038dc51c57c317 Mon Sep 17 00:00:00 2001 From: Micael Karlberg Date: Wed, 29 Apr 2020 17:57:07 +0200 Subject: [megaco|test] Add test cases OTP-16631 --- lib/megaco/test/megaco_codec_mini_SUITE.erl | 401 +++++++++++++++++++++++++++- 1 file changed, 399 insertions(+), 2 deletions(-) diff --git a/lib/megaco/test/megaco_codec_mini_SUITE.erl b/lib/megaco/test/megaco_codec_mini_SUITE.erl index 12113aae70..6c7f60db05 100644 --- a/lib/megaco/test/megaco_codec_mini_SUITE.erl +++ b/lib/megaco/test/megaco_codec_mini_SUITE.erl @@ -39,7 +39,32 @@ init_per_testcase/2, end_per_testcase/2, otp7672_msg01/1, - otp7672_msg02/1 + otp7672_msg02/1, + + otp16631_msg01/1, + otp16631_msg02/1, + otp16631_msg03/1, + otp16631_msg04/1, + otp16631_msg05/1, + otp16631_msg06/1, + otp16631_msg11/1, + otp16631_msg12/1, + otp16631_msg13/1, + otp16631_msg14/1, + otp16631_msg15/1, + otp16631_msg16/1, + otp16631_msg21/1, + otp16631_msg22/1, + otp16631_msg23/1, + otp16631_msg24/1, + otp16631_msg25/1, + otp16631_msg26/1, + otp16631_msg31/1, + otp16631_msg32/1, + otp16631_msg33/1, + otp16631_msg34/1, + otp16631_msg35/1, + otp16631_msg36/1 ]). @@ -62,15 +87,51 @@ all() -> groups() -> [ - {tickets, [], tickets_cases()} + {tickets, [], tickets_cases()}, + {otp7672, [], otp7672_cases()}, + {otp16631, [], otp16631_cases()} ]. tickets_cases() -> + [ + {group, otp7672}, + {group, otp16631} + ]. + +otp7672_cases() -> [ otp7672_msg01, otp7672_msg02 ]. +otp16631_cases() -> + [ + otp16631_msg01, + otp16631_msg02, + otp16631_msg03, + otp16631_msg04, + otp16631_msg05, + otp16631_msg06, + otp16631_msg11, + otp16631_msg12, + otp16631_msg13, + otp16631_msg14, + otp16631_msg15, + otp16631_msg16, + otp16631_msg21, + otp16631_msg22, + otp16631_msg23, + otp16631_msg24, + otp16631_msg25, + otp16631_msg26, + otp16631_msg31, + otp16631_msg32, + otp16631_msg33, + otp16631_msg34, + otp16631_msg35, + otp16631_msg36 + ]. + %% @@ -200,6 +261,342 @@ otp7672(Msg) -> end. + +%% -------------------------------------------------------------- +%% + +otp16631_msg01(suite) -> + []; +otp16631_msg01(Config) when is_list(Config) -> + d("otp16631_msg01 -> entry", []), + ok = otp16631( otp16631_msg01() ), + ok. + +otp16631_msg01() -> + otp16631_msg("a"). + + +%% -- + +otp16631_msg02(suite) -> + []; +otp16631_msg02(Config) when is_list(Config) -> + d("otp16631_msg02 -> entry", []), + ok = otp16631( otp16631_msg02() ), + ok. + +otp16631_msg02() -> + otp16631_msg("b"). + + +%% -- + +otp16631_msg03(suite) -> + []; +otp16631_msg03(Config) when is_list(Config) -> + d("otp16631_msg03 -> entry", []), + ok = otp16631( otp16631_msg03() ), + ok. + +otp16631_msg03() -> + otp16631_msg("c"). + + +%% -- + +otp16631_msg04(suite) -> + []; +otp16631_msg04(Config) when is_list(Config) -> + d("otp16631_msg04 -> entry", []), + ok = otp16631( otp16631_msg04() ), + ok. + +otp16631_msg04() -> + otp16631_msg("d"). + + +%% -- + +otp16631_msg05(suite) -> + []; +otp16631_msg05(Config) when is_list(Config) -> + d("otp16631_msg05 -> entry", []), + ok = otp16631( otp16631_msg05() ), + ok. + +otp16631_msg05() -> + otp16631_msg("e"). + + +%% -- + +otp16631_msg06(suite) -> + []; +otp16631_msg06(Config) when is_list(Config) -> + d("otp16631_msg06 -> entry", []), + ok = otp16631( otp16631_msg06() ), + ok. + +otp16631_msg06() -> + otp16631_msg("f"). + + +%% -- + +otp16631_msg11(suite) -> + []; +otp16631_msg11(Config) when is_list(Config) -> + d("otp16631_msg11 -> entry", []), + ok = otp16631( otp16631_msg11() ), + ok. + +otp16631_msg11() -> + otp16631_msg("000a"). + + +%% -- + +otp16631_msg12(suite) -> + []; +otp16631_msg12(Config) when is_list(Config) -> + d("otp16631_msg12 -> entry", []), + ok = otp16631( otp16631_msg12() ), + ok. + +otp16631_msg12() -> + otp16631_msg("000b"). + + +%% -- + +otp16631_msg13(suite) -> + []; +otp16631_msg13(Config) when is_list(Config) -> + d("otp16631_msg13 -> entry", []), + ok = otp16631( otp16631_msg13() ), + ok. + +otp16631_msg13() -> + otp16631_msg("000c"). + + +%% -- + +otp16631_msg14(suite) -> + []; +otp16631_msg14(Config) when is_list(Config) -> + d("otp16631_msg14 -> entry", []), + ok = otp16631( otp16631_msg14() ), + ok. + +otp16631_msg14() -> + otp16631_msg("000d"). + + +%% -- + +otp16631_msg15(suite) -> + []; +otp16631_msg15(Config) when is_list(Config) -> + d("otp16631_msg15 -> entry", []), + ok = otp16631( otp16631_msg15() ), + ok. + +otp16631_msg15() -> + otp16631_msg("000e"). + + +%% -- + +otp16631_msg16(suite) -> + []; +otp16631_msg16(Config) when is_list(Config) -> + d("otp16631_msg16 -> entry", []), + ok = otp16631( otp16631_msg16() ), + ok. + +otp16631_msg16() -> + otp16631_msg("000f"). + + +%% -- + +otp16631_msg21(suite) -> + []; +otp16631_msg21(Config) when is_list(Config) -> + d("otp16631_msg21 -> entry", []), + ok = otp16631( otp16631_msg21() ), + ok. + +otp16631_msg21() -> + otp16631_msg("0a12"). + + +%% -- + +otp16631_msg22(suite) -> + []; +otp16631_msg22(Config) when is_list(Config) -> + d("otp16631_msg22 -> entry", []), + ok = otp16631( otp16631_msg22() ), + ok. + +otp16631_msg22() -> + otp16631_msg("0b12"). + + +%% -- + +otp16631_msg23(suite) -> + []; +otp16631_msg23(Config) when is_list(Config) -> + d("otp16631_msg23 -> entry", []), + ok = otp16631( otp16631_msg23() ), + ok. + +otp16631_msg23() -> + otp16631_msg("0c12"). + + +%% -- + +otp16631_msg24(suite) -> + []; +otp16631_msg24(Config) when is_list(Config) -> + d("otp16631_msg24 -> entry", []), + ok = otp16631( otp16631_msg24() ), + ok. + +otp16631_msg24() -> + otp16631_msg("0d12"). + + +%% -- + +otp16631_msg25(suite) -> + []; +otp16631_msg25(Config) when is_list(Config) -> + d("otp16631_msg25 -> entry", []), + ok = otp16631( otp16631_msg25() ), + ok. + +otp16631_msg25() -> + otp16631_msg("0e12"). + + +%% -- + +otp16631_msg26(suite) -> + []; +otp16631_msg26(Config) when is_list(Config) -> + d("otp16631_msg26 -> entry", []), + ok = otp16631( otp16631_msg26() ), + ok. + +otp16631_msg26() -> + otp16631_msg("0f12"). + + +%% -- + +otp16631_msg31(suite) -> + []; +otp16631_msg31(Config) when is_list(Config) -> + d("otp16631_msg31 -> entry", []), + ok = otp16631( otp16631_msg31() ), + ok. + +otp16631_msg31() -> + otp16631_msg("a123"). + + +%% -- + +otp16631_msg32(suite) -> + []; +otp16631_msg32(Config) when is_list(Config) -> + d("otp16631_msg32 -> entry", []), + ok = otp16631( otp16631_msg32() ), + ok. + +otp16631_msg32() -> + otp16631_msg("b123"). + + +%% -- + +otp16631_msg33(suite) -> + []; +otp16631_msg33(Config) when is_list(Config) -> + d("otp16631_msg33 -> entry", []), + ok = otp16631( otp16631_msg33() ), + ok. + +otp16631_msg33() -> + otp16631_msg("c123"). + + +%% -- + +otp16631_msg34(suite) -> + []; +otp16631_msg34(Config) when is_list(Config) -> + d("otp16631_msg34 -> entry", []), + ok = otp16631( otp16631_msg34() ), + ok. + +otp16631_msg34() -> + otp16631_msg("d123"). + + +%% -- + +otp16631_msg35(suite) -> + []; +otp16631_msg35(Config) when is_list(Config) -> + d("otp16631_msg35 -> entry", []), + ok = otp16631( otp16631_msg35() ), + ok. + +otp16631_msg35() -> + otp16631_msg("e123"). + + +%% -- + +otp16631_msg36(suite) -> + []; +otp16631_msg36(Config) when is_list(Config) -> + d("otp16631_msg36 -> entry", []), + ok = otp16631( otp16631_msg36() ), + ok. + +otp16631_msg36() -> + otp16631_msg("f123"). + + +%% ----- + +otp16631( Msg ) -> + Bin = erlang:list_to_binary(Msg), + try megaco_compact_text_encoder:decode_mini_message([], dynamic, Bin) of + {ok, _} -> + ok; + {error, _} = ERROR -> + ERROR + catch + C:E:S -> + {error, {C, E, S}} + end. + + +otp16631_msg(X) when is_list(X) -> + "!/1 [2409:8050:5005:1243:1011::" ++ X ++ + "] T=2523{C=-{SC=ROOT{SV{MT=RS,RE=901,PF=ETSI_BGF/2,V=3}}}}". + + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% p(F, A) -> -- cgit v1.2.1