This is an automated email from the ASF dual-hosted git repository. billblough pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/axis-axis2-c-core.git
commit 395d09b6f24a2cead76a2e0015aeb8af14764799 Author: Bill Blough <de...@blough.us> AuthorDate: Fri Apr 10 00:03:30 2020 -0400 Fix parsing of CDATA sections JIRA: AXIS2C-1453 --- axiom/configure.ac | 1 + axiom/test/Makefile.am | 2 +- axiom/test/{ => parser}/Makefile.am | 20 ++++++++-- axiom/test/parser/test_parser.cc | 76 ++++++++++++++++++++++++++++++++++++ guththila/src/guththila_xml_parser.c | 46 +++++++++++++++++++++- 5 files changed, 140 insertions(+), 5 deletions(-) diff --git a/axiom/configure.ac b/axiom/configure.ac index f55ba91..a952199 100644 --- a/axiom/configure.ac +++ b/axiom/configure.ac @@ -266,6 +266,7 @@ AC_CONFIG_FILES([Makefile \ gtest/Makefile \ test/Makefile \ test/om/Makefile \ + test/parser/Makefile \ test/soap/Makefile \ test/util/Makefile \ test/xpath/Makefile \ diff --git a/axiom/test/Makefile.am b/axiom/test/Makefile.am index e05ad29..b6fe541 100644 --- a/axiom/test/Makefile.am +++ b/axiom/test/Makefile.am @@ -13,5 +13,5 @@ # See the License for the specific language governing permissions and # limitations under the License. TESTS = -SUBDIRS = om soap util xpath +SUBDIRS = om soap util xpath parser EXTRA_DIST = resources diff --git a/axiom/test/Makefile.am b/axiom/test/parser/Makefile.am similarity index 58% copy from axiom/test/Makefile.am copy to axiom/test/parser/Makefile.am index e05ad29..9824a85 100644 --- a/axiom/test/Makefile.am +++ b/axiom/test/parser/Makefile.am @@ -12,6 +12,20 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -TESTS = -SUBDIRS = om soap util xpath -EXTRA_DIST = resources +TESTS = test_parser +noinst_PROGRAMS = test_parser +check_PROGRAMS = test_parser +SUBDIRS = + +test_parser_SOURCES = test_parser.cc + +test_parser_LDADD = $(top_builddir)/../util/src/libaxutil.la \ + $(top_builddir)/src/parser/$(WRAPPER_DIR)/libaxis2_parser.la \ + $(top_builddir)/src/om/libaxis2_axiom.la \ + $(top_builddir)/$(GTEST)/libgtest.a \ + $(top_builddir)/$(GTEST)/libgtest_main.a + +AM_CPPFLAGS = -I$(top_srcdir)/include \ + -I$(top_srcdir)/src/parser \ + -I $(top_srcdir)/../util/include \ + -I $(GTEST_DIR)/include diff --git a/axiom/test/parser/test_parser.cc b/axiom/test/parser/test_parser.cc new file mode 100644 index 0000000..9a3c918 --- /dev/null +++ b/axiom/test/parser/test_parser.cc @@ -0,0 +1,76 @@ +/* +* Licensed to the Apache Software Foundation (ASF) under one or more +* contributor license agreements. See the NOTICE file distributed with +* this work for additional information regarding copyright ownership. +* The ASF licenses this file to You under the Apache License, Version 2.0 +* (the "License"); you may not use this file except in compliance with +* the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +#include <gtest/gtest.h> + +#include <axiom.h> + + +class TestParser: public ::testing::Test +{ + + protected: + void SetUp() + { + m_allocator = axutil_allocator_init(NULL); + ASSERT_NE(m_allocator, nullptr); + m_env = axutil_env_create(m_allocator); + ASSERT_NE(m_env, nullptr); + } + + void TearDown() + { + axutil_env_free(m_env); + } + + axutil_allocator_t *m_allocator; + axutil_env_t *m_env; +}; + + +TEST_F(TestParser, test_axisc_1453) { + + void* buffer[256]; + axis2_char_t input1[] = "<root><![CDATA[abc{def]]></root>"; + axis2_char_t expected1[] = "<root>abc&#123;def</root>"; + + axiom_node_t* node_input1 = axiom_node_create_from_buffer(m_env, input1); + ASSERT_NE(node_input1, nullptr); + axis2_char_t* output1 = axiom_node_to_string(node_input1, m_env); + ASSERT_NE(output1, nullptr); + ASSERT_STREQ(output1, expected1); + + + axis2_char_t input2[] = "<root><![CDATA[abc</root>def]]></root>"; + axis2_char_t expected2[] = "<root>abc</root>def</root>"; + + axiom_node_t* node_input2 = axiom_node_create_from_buffer(m_env, input2); + ASSERT_NE(node_input2, nullptr); + axis2_char_t* output2 = axiom_node_to_string(node_input2, m_env); + ASSERT_NE(output2, nullptr); + ASSERT_STREQ(output2, expected2); + + axis2_char_t input3[] = "<root><![CDATA[]]></root>"; + axis2_char_t expected3[] = "<root></root>"; + + axiom_node_t* node_input3 = axiom_node_create_from_buffer(m_env, input3); + ASSERT_NE(node_input3, nullptr); + axis2_char_t* output3 = axiom_node_to_string(node_input3, m_env); + ASSERT_NE(output3, nullptr); + ASSERT_STREQ(output3, expected3); + +} diff --git a/guththila/src/guththila_xml_parser.c b/guththila/src/guththila_xml_parser.c index 2d86511..4787662 100644 --- a/guththila/src/guththila_xml_parser.c +++ b/guththila/src/guththila_xml_parser.c @@ -1094,6 +1094,46 @@ guththila_next( } } } + else if ('[' == c_arra[0] && 'C' == c_arra[1]) + { + if (5 == guththila_next_no_char(m, 0, c_arra, 5, env) && + 'D' == c_arra[0] && 'A' == c_arra[1] && 'T' == c_arra[2] && + 'A' == c_arra[3] && '[' == c_arra[4]) + { + /* CDATA */ + + int loop_state = 1; + GUTHTHILA_NEXT_CHAR(m, buffer, data_size, previous_size, env, c); + GUTHTHILA_TOKEN_OPEN(m, tok, env); + while(loop_state) + { + if (']' == c) + { + if (2 == guththila_next_no_char(m, 0, c_arra, 2, env) && + ']' == c_arra[0]) + { + if ('>' == c_arra[1]) + { + m->next = m->next - 2; + guththila_token_close(m, tok, _char_data, 0, env); + m->next = m->next + 2; + loop_state = 0; + m->guththila_event = GUTHTHILA_CHARACTER; + return GUTHTHILA_CHARACTER; + } + } + } + if (-1 == c) { + return -1; + } + GUTHTHILA_NEXT_CHAR(m, buffer, data_size, previous_size, env, c); + } + } + else + { + return -1; + } + } else { GUTHTHILA_NEXT_CHAR(m, buffer, data_size, previous_size, env, c); @@ -1452,7 +1492,11 @@ guththila_get_value( if(m->value) { GUTHTHILA_TOKEN_TO_STRING(m->value, str, env); - guththila_string_evaluate_references(str, GUTHTHILA_TOKEN_LEN(m->value)); + /* don't eval references in comments or cdata sections */ + if (m->value->type != _char_data) + { + guththila_string_evaluate_references(str, GUTHTHILA_TOKEN_LEN(m->value)); + } return str; } return NULL;