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