From cafdd2e9d2ea2d7e7700784518f22fb1f7a567eb Mon Sep 17 00:00:00 2001
From: Botond Baranyi <botond.baranyi@ericsson.com>
Date: Thu, 28 Jan 2021 13:43:04 +0100
Subject: [PATCH] Fixed decoding of compact XML with 'useType' variant (bug
 570707)

Signed-off-by: Botond Baranyi <botond.baranyi@ericsson.com>
Change-Id: I59f5e71bdcf79cd567aaef05c18e99ff20e93e87
Signed-off-by: Botond Baranyi <botond.baranyi@ericsson.com>
---
 compiler2/record.c                           |   3 +-
 core2/Basetype2.cc                           |   2 +-
 regression_test/XML/Bug570707/.gitignore     |   7 +
 regression_test/XML/Bug570707/Bug570707.ttcn |  54 +++++++
 regression_test/XML/Bug570707/Makefile       | 147 +++++++++++++++++++
 regression_test/XML/Makefile                 |   2 +-
 6 files changed, 212 insertions(+), 3 deletions(-)
 create mode 100644 regression_test/XML/Bug570707/.gitignore
 create mode 100644 regression_test/XML/Bug570707/Bug570707.ttcn
 create mode 100644 regression_test/XML/Bug570707/Makefile

diff --git a/compiler2/record.c b/compiler2/record.c
index 87bb1f443..50c135288 100644
--- a/compiler2/record.c
+++ b/compiler2/record.c
@@ -2765,8 +2765,9 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc)
   } /* * * * * * * * * end if(attributes...) * * * * * * * * * * * * */
 
   src = mputprintf(src,
-    "  if ((!omit_tag || parent_tag) && !p_reader.IsEmptyElement()%s) "
+    "  if ((!omit_tag%s) && !p_reader.IsEmptyElement()%s) "
     "rd_ok = p_reader.Read();\n"
+    , num_attributes > 0 ? " || parent_tag" : ""
     , sdef->xerUseNilPossible ? " && !already_processed" : "");
 
   if (sdef->xerEmbedValuesPossible && num_attributes==0) {
diff --git a/core2/Basetype2.cc b/core2/Basetype2.cc
index a24b678c7..0466631a7 100644
--- a/core2/Basetype2.cc
+++ b/core2/Basetype2.cc
@@ -5606,7 +5606,7 @@ int Record_Type::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader,
       i = first_nonattr; // finished with attributes
       // AdvanceAttribute did MoveToElement. Move into the content (if any),
       // except when the reader is already moved in(already_processed).
-      if (!reader.IsEmptyElement() && !already_processed) reader.Read();
+      if (!reader.IsEmptyElement() && !already_processed && (!parent_tag || num_attributes > 0)) reader.Read();
     } // end if (own_tag)
     
     /* * * * * * * * Non-attributes (elements) * * * * * * * * * * * */
diff --git a/regression_test/XML/Bug570707/.gitignore b/regression_test/XML/Bug570707/.gitignore
new file mode 100644
index 000000000..24a01f229
--- /dev/null
+++ b/regression_test/XML/Bug570707/.gitignore
@@ -0,0 +1,7 @@
+Bug570707
+Bug570707.exe
+Bug570707*.cc
+Bug570707*.hh
+Bug570707*.d
+compile
+Bug570707*.log
diff --git a/regression_test/XML/Bug570707/Bug570707.ttcn b/regression_test/XML/Bug570707/Bug570707.ttcn
new file mode 100644
index 000000000..1a4e55007
--- /dev/null
+++ b/regression_test/XML/Bug570707/Bug570707.ttcn
@@ -0,0 +1,54 @@
+/******************************************************************************
+ * Copyright (c) 2000-2021 Ericsson Telecom AB
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
+ *
+ * Contributors:
+ *   Baranyi, Botond
+ *
+ ******************************************************************************/
+module Bug570707 {
+
+type union Uni {
+  integer a,
+  Rec b
+}
+with {
+  variant "useType";
+}
+
+type record Rec {
+  universal charstring x,
+  universal charstring y
+}
+
+external function f_dec(in octetstring x) return Uni
+with { extension "prototype(convert) decode(XER:XER_EXTENDED)" }
+
+type component CT {}
+
+testcase tc_Bug570707() runs on CT {
+  var charstring data := "<Uni xmlns='http://www.somewhere.com/A' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:type='b'><x>a</x><y>b</y></Uni>";
+  var Uni res := f_dec(char2oct(data));
+  var Uni exp := { b := { x := "a", y := "b" } };
+  if (res == exp) {
+    setverdict(pass);
+  }
+  else {
+    setverdict(fail, res);
+  }
+}
+
+control {
+  execute(tc_Bug570707());
+}
+
+}
+with {
+  encode "XML";
+  variant "namespace as 'http://www.somewhere.com/A'";
+  variant "controlNamespace 'http://www.w3.org/2001/XMLSchema-instance' prefix 'xsi'";
+  variant "elementFormQualified";
+}
diff --git a/regression_test/XML/Bug570707/Makefile b/regression_test/XML/Bug570707/Makefile
new file mode 100644
index 000000000..69e2a8daa
--- /dev/null
+++ b/regression_test/XML/Bug570707/Makefile
@@ -0,0 +1,147 @@
+##############################################################################
+# Copyright (c) 2000-2021 Ericsson Telecom AB
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
+#
+# Contributors:
+#   Baranyi, Botond
+#
+##############################################################################
+TOPDIR = ../..
+include $(TOPDIR)/Makefile.regression
+
+# WARNING! This Makefile can be used with GNU make only.
+# Other versions of make may report syntax errors in it.
+
+#
+# Do NOT touch this line...
+#
+.PHONY: all archive check clean dep objects
+
+.SUFFIXES: .d
+
+#
+# Set these variables...
+#
+
+# Flags for the C++ preprocessor (and makedepend as well):
+#CPPFLAGS +=
+
+# Flags for dependency generation
+CXXDEPFLAGS = -MM
+
+# Flags for the C++ compiler:
+CXXFLAGS += -Wall
+
+# Flags for the linker:
+#LDFLAGS += 
+
+# Flags for the TTCN-3 and ASN.1 compiler:
+#COMPILER_FLAGS +=  
+
+# Execution mode: (either ttcn3 or ttcn3-parallel)
+TTCN3_LIB = ttcn3$(RT2_SUFFIX)$(DYNAMIC_SUFFIX)
+
+#
+# You may change these variables. Add your files if necessary...
+#
+
+# TTCN-3 modules of this project:
+TTCN3_MODULES = Bug570707.ttcn
+
+# ASN.1 modules of this project:
+ASN1_MODULES =
+
+# C++ source & header files generated from the TTCN-3 & ASN.1 modules of
+# this project:
+GENERATED_SOURCES = $(TTCN3_MODULES:.ttcn=.cc) $(ASN1_MODULES:.asn=.cc)
+GENERATED_HEADERS = $(GENERATED_SOURCES:.cc=.hh)
+ifdef SPLIT_TO_SLICES
+POSTFIXES := $(foreach file, $(SPLIT_TO_SLICES), $(addsuffix $(file), _part_))
+POSTFIXES := $(foreach file, $(POSTFIXES), $(addprefix $(file), .cc))
+GENERATED_SOURCES2 := $(foreach file, $(GENERATED_SOURCES:.cc=), $(addprefix $(file), $(POSTFIXES)))
+GENERATED_SOURCES += $(GENERATED_SOURCES2)
+endif
+# C/C++ Source & header files of Test Ports, external functions and
+# other modules:
+USER_SOURCES =
+USER_HEADERS = $(USER_SOURCES:.cc=.hh)
+
+# Object files of this project that are needed for the executable test suite:
+OBJECTS = $(GENERATED_OBJECTS) $(USER_OBJECTS)
+
+GENERATED_OBJECTS = $(GENERATED_SOURCES:.cc=.o)
+
+USER_OBJECTS = $(USER_SOURCES:.cc=.o)
+
+DEPFILES = $(USER_OBJECTS:.o=.d)  $(GENERATED_OBJECTS:.o=.d)
+
+# Other files of the project (Makefile, configuration files, etc.)
+# that will be added to the archived source files:
+OTHER_FILES = Makefile
+
+# The name of the executable test suite:
+TARGET = Bug570707$(EXESUFFIX)
+
+#
+# Rules for building the executable...
+#
+
+all: $(TARGET) ;
+
+objects: $(OBJECTS) compile;
+
+$(TARGET): $(OBJECTS)
+	if $(CXX) $(LDFLAGS) -o $@ $^ \
+	-L$(TTCN3_DIR)/lib -l$(TTCN3_LIB) \
+	-L$(OPENSSL_DIR)/lib -lcrypto \
+	-L$(XMLDIR)/lib $($(PLATFORM)_LIBS); \
+	then : ; else $(TTCN3_DIR)/bin/titanver $(OBJECTS); exit 1; fi
+
+.cc.o .c.o:
+	$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) -o $@ $<
+
+.cc.d .c.d:
+	@echo Creating dependency file for '$<'; set -e; \
+	$(CXX) $(CXXDEPFLAGS) $(CPPFLAGS) $(CXXFLAGS) $< \
+	| sed 's/\($*\)\.o[ :]*/\1.o $@ : /g' > $@; \
+	[ -s $@ ] || rm -f $@
+
+$(GENERATED_SOURCES) $(GENERATED_HEADERS): compile
+	@if [ ! -f $@ ]; then $(RM) compile; $(MAKE) compile; fi
+
+compile: $(TTCN3_MODULES) $(ASN1_MODULES)
+	$(TTCN3_COMPILER) $(COMPILER_FLAGS) $^ - $?
+	touch $@
+
+clean distclean:
+	-$(RM) $(TARGET) $(OBJECTS) $(GENERATED_HEADERS) \
+	$(GENERATED_SOURCES) compile $(DEPFILES) \
+	tags *.log
+
+dep: $(GENERATED_SOURCES) $(USER_SOURCES) ;
+
+ifeq ($(findstring n,$(MAKEFLAGS)),)
+ifeq ($(filter clean distclean check compile archive diag,$(MAKECMDGOALS)),)
+-include $(DEPFILES)
+endif
+endif
+
+diag:
+	$(TTCN3_COMPILER) -v 2>&1
+	$(TTCN3_DIR)/bin/mctr_cli -v 2>&1
+	$(CXX) -v 2>&1
+	@echo TTCN3_DIR=$(TTCN3_DIR)
+	@echo OPENSSL_DIR=$(OPENSSL_DIR)
+	@echo XMLDIR=$(XMLDIR)
+	@echo PLATFORM=$(PLATFORM)
+
+#
+# Add your rules here if necessary...
+#
+
+run: $(TARGET)
+	./$^
+
diff --git a/regression_test/XML/Makefile b/regression_test/XML/Makefile
index 5f053a323..43c226eaf 100644
--- a/regression_test/XML/Makefile
+++ b/regression_test/XML/Makefile
@@ -30,7 +30,7 @@ endif
 XDIRS := $(wildcard $(SHADOWED)) xsdConverter \
 HM60295 HN15589 HQ30408 HR49727 HU13380 $(RT2_ONLY) \
 XmlWorkflow tpdValidTest AbstractBlock UseNilLong AttributeFormDefault \
-RecordOmit XSDBaseType LegacyUntaggedUnion Printing
+RecordOmit XSDBaseType LegacyUntaggedUnion Printing Bug570707
 
 # List of fake targets:
 .PHONY: all dep clean run $(XDIRS) $(addsuffix /, $(XDIRS)) profile
-- 
GitLab