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