From 4b09fee3d72f4f4bef16a343f46cf16d44a7d8d9 Mon Sep 17 00:00:00 2001
From: Botond Baranyi <botond.baranyi@ericsson.com>
Date: Wed, 11 Nov 2020 11:43:50 +0100
Subject: [PATCH] Fixed JSON decoding of similar records/sets inside an 'as
 value' union (bug 568645)

Signed-off-by: Botond Baranyi <botond.baranyi@ericsson.com>
Change-Id: Ic386b5ab6cd050bb77c565e47d35aed0b6f19baf
---
 compiler2/record.c                            |  3 ++
 .../JSON/JsonComplexTest/JsonTestcases.ttcn   | 29 +++++++++++++++++++
 .../JSON/JsonComplexTest/JsonTypes.ttcn       | 23 +++++++++++++++
 3 files changed, 55 insertions(+)

diff --git a/compiler2/record.c b/compiler2/record.c
index a8f1eb0c0..805dc50c0 100644
--- a/compiler2/record.c
+++ b/compiler2/record.c
@@ -3512,6 +3512,9 @@ char* generate_json_decoder(char* src, const struct_def* sdef)
     src = mputprintf(src,
       "{\n"
                // invalid field name
+      "        if (p_silent) {\n"
+      "          return JSON_ERROR_INVALID_TOKEN;\n"
+      "        }\n"
       "        JSON_ERROR(TTCN_EncDec::ET_INVAL_MSG, %sJSON_DEC_INVALID_NAME_ERROR, (int)name_len, fld_name);\n"
                // if this is set to a warning, skip the value of the field
       "        dec_len += p_tok.get_next_token(&j_token, NULL, NULL);\n"
diff --git a/regression_test/EncodeDecode/JSON/JsonComplexTest/JsonTestcases.ttcn b/regression_test/EncodeDecode/JSON/JsonComplexTest/JsonTestcases.ttcn
index 4dcc60bcf..9a276a5a4 100644
--- a/regression_test/EncodeDecode/JSON/JsonComplexTest/JsonTestcases.ttcn
+++ b/regression_test/EncodeDecode/JSON/JsonComplexTest/JsonTestcases.ttcn
@@ -844,6 +844,34 @@ testcase tc_bug_522660() runs on MTC {
   }
 }
 
+testcase tc_bug_568645() runs on MTC {
+  var universal charstring stream := "{ \"i1\":123}";
+  var Uni568645 pdu_decoded;
+  var Uni568645 pdu_expected := { field1 := { i1 := 123 } };
+  var integer result := decvalue_unichar(stream, pdu_decoded);
+  if (result != 0 or pdu_decoded != pdu_expected) {
+    setverdict(fail, "Test #1 failed. Result: ", result, ". Decoded value: ",
+      pdu_decoded, ", expected: ", pdu_expected);
+  }
+  
+  stream := "{ \"i1\":123, \"i2\":456}";
+  pdu_expected := { field2 := { i1 := 123, i2 := 456 } };
+  result := decvalue_unichar(stream, pdu_decoded);
+  if (result != 0 or pdu_decoded != pdu_expected) {
+    setverdict(fail, "Test #2 failed. Result: ", result, ". Decoded value: ",
+      pdu_decoded, ", expected: ", pdu_expected);
+  }
+  
+  stream := "{ \"i1\":123, \"i2\":[1,2,3]}";
+  pdu_expected := { field3 := { i1 := 123, i2 := { 1, 2, 3 } } };
+  result := decvalue_unichar(stream, pdu_decoded);
+  if (result != 0 or pdu_decoded != pdu_expected) {
+    setverdict(fail, "Test #3 failed. Result: ", result, ". Decoded value: ",
+      pdu_decoded, ", expected: ", pdu_expected);
+  }
+  setverdict(pass);
+}
+
 //=========================================================================
 // Control
 //=========================================================================
@@ -935,6 +963,7 @@ control {
   execute(tc_multi_level_recordof());
   
   execute(tc_bug_522660());
+  execute(tc_bug_568645());
 }
 
 
diff --git a/regression_test/EncodeDecode/JSON/JsonComplexTest/JsonTypes.ttcn b/regression_test/EncodeDecode/JSON/JsonComplexTest/JsonTypes.ttcn
index bdc7fbc24..2b8f6a06c 100644
--- a/regression_test/EncodeDecode/JSON/JsonComplexTest/JsonTypes.ttcn
+++ b/regression_test/EncodeDecode/JSON/JsonComplexTest/JsonTypes.ttcn
@@ -395,6 +395,29 @@ with {
 
 type record of EnumNumber EnumNumberList;
 
+type union Uni568645 {
+  Set568645a field1,
+  Set568645b field2,
+  Set568645c field3
+}
+with {
+  variant "JSON: as value"
+}
+
+type set Set568645a {
+  integer i1
+}
+
+type set Set568645b {
+  integer i1,
+  integer i2
+}
+
+type set Set568645c {
+  integer i1,
+  record of integer i2
+}
+
 } with {
   encode "JSON";
   extension "anytype integer, charstring, R, RoI, Thing";
-- 
GitLab