From 073a245374bbf0bfc50b88ce84bdc40ca6012b82 Mon Sep 17 00:00:00 2001 From: Botond Baranyi <botond.baranyi@ericsson.com> Date: Fri, 22 Sep 2017 18:28:40 +0200 Subject: [PATCH] JSON dec: fixed union field recognition fault (bug 522660) Change-Id: I7dbc389c8be16fe49bded538b4aacd8a23aa9193 Signed-off-by: Botond Baranyi <botond.baranyi@ericsson.com> --- compiler2/union.c | 3 ++- regression_test/json/Testcases.ttcn | 19 +++++++++++++++++++ regression_test/json/Types.ttcn | 5 +++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/compiler2/union.c b/compiler2/union.c index bbdb18360..39cb613e6 100644 --- a/compiler2/union.c +++ b/compiler2/union.c @@ -2326,7 +2326,7 @@ void defUnionClass(struct_def const *sdef, output_struct *output) , unbound_value); for (i = 0; i < sdef->nElements; ++i) { src = mputprintf(src, - "if (0 == strncmp(fld_name, \"%s\", name_len)) {\n" + "if (%d == name_len && 0 == strncmp(fld_name, \"%s\", name_len)) {\n" " int ret_val = %s%s().JSON_decode(%s_descr_, p_tok, p_silent);\n" " if (0 > ret_val) {\n" " if (JSON_ERROR_INVALID_TOKEN) {\n" @@ -2337,6 +2337,7 @@ void defUnionClass(struct_def const *sdef, output_struct *output) " dec_len += (size_t)ret_val;\n" " }\n" " } else " + , (int)strlen(sdef->elements[i].jsonAlias ? sdef->elements[i].jsonAlias : sdef->elements[i].dispname) , sdef->elements[i].jsonAlias ? sdef->elements[i].jsonAlias : sdef->elements[i].dispname , at_field, sdef->elements[i].name, sdef->elements[i].typedescrname , (unsigned long) strlen(sdef->elements[i].dispname), sdef->elements[i].dispname); diff --git a/regression_test/json/Testcases.ttcn b/regression_test/json/Testcases.ttcn index 28b86681e..40b5d132b 100644 --- a/regression_test/json/Testcases.ttcn +++ b/regression_test/json/Testcases.ttcn @@ -824,6 +824,23 @@ testcase tc_multi_level_recordof() runs on MTC { f_bool2verdict(match(f_dec_multi_list(os), x)); } +testcase tc_bug_522660() runs on MTC { + var universal charstring enc1 := "{\"f12\":10}"; + var universal charstring enc2 := "{\"f1\":10}"; + var Uni522660 x1, x2; + var integer res1 := decvalue_unichar(enc1, x1); + var integer res2 := decvalue_unichar(enc2, x2); + if (res1 != 0 or x1 != { f12 := 10 }) { + setverdict(fail, "Test #1 failed. Result: ", res1, ". Decoded value: ", x1); + } + else if (res2 != 0 or x2 != { f1 := 10 }) { + setverdict(fail, "Test #2 failed. Result: ", res2, ". Decoded value: ", x2); + } + else { + setverdict(pass); + } +} + //========================================================================= // Control //========================================================================= @@ -913,6 +930,8 @@ control { execute(tc_embedded_anytype()); execute(tc_multi_level_record()); execute(tc_multi_level_recordof()); + + execute(tc_bug_522660()); } diff --git a/regression_test/json/Types.ttcn b/regression_test/json/Types.ttcn index b3978c274..18d89d733 100644 --- a/regression_test/json/Types.ttcn +++ b/regression_test/json/Types.ttcn @@ -300,6 +300,11 @@ with { variant (days[-]) "JSON: as number"; } +type union Uni522660 { + integer f12, + integer f1 +} + } with { encode "JSON"; extension "anytype integer, charstring, R, RoI, Thing"; -- GitLab