From b5297abbf380f99abd72b29fd1770e64baceea35 Mon Sep 17 00:00:00 2001
From: Botond Baranyi <botond.baranyi@ericsson.com>
Date: Thu, 3 Jan 2019 17:54:26 +0100
Subject: [PATCH] Added error behavior option for data remaining after decoding
 (bug 543155)

Change-Id: Ic3c5e39ecc0efc7f56b5859b9a18c99e62298ff6
Signed-off-by: Botond Baranyi <botond.baranyi@ericsson.com>
---
 compiler2/ttcn3/AST_ttcn3.cc | 33 ++++++++++++---------------------
 compiler2/ttcn3/Ttcnstuff.cc |  3 ++-
 core/Encdec.cc               |  6 ++++--
 core/Encdec.hh               |  3 ++-
 4 files changed, 20 insertions(+), 25 deletions(-)

diff --git a/compiler2/ttcn3/AST_ttcn3.cc b/compiler2/ttcn3/AST_ttcn3.cc
index dab85976b..67e40b153 100644
--- a/compiler2/ttcn3/AST_ttcn3.cc
+++ b/compiler2/ttcn3/AST_ttcn3.cc
@@ -7447,28 +7447,19 @@ namespace Ttcn {
       // checking for remaining data in the buffer if decoding was successful
       str = mputprintf(str, "if (TTCN_EncDec::get_last_error_type() == "
           "TTCN_EncDec::ET_NONE) {\n"
-        "if (ttcn_buffer.get_pos() < ttcn_buffer.get_len() && "
-          "TTCN_Logger::log_this_event(TTCN_WARNING)) {\n"
+        "if (ttcn_buffer.get_pos() < ttcn_buffer.get_len()) {\n"
         "ttcn_buffer.cut();\n"
-        "%s remaining_stream;\n",
-        input_type->get_genname_value(my_scope).c_str());
-      if (input_type->get_type_refd_last()->get_typetype_ttcn3() ==
-          Common::Type::T_BSTR) {
-        str = mputstr(str,
-          "OCTETSTRING tmp_os;\n"
-          "ttcn_buffer.get_string(tmp_os);\n"
-          "remaining_stream = oct2bit(tmp_os);\n");
-      }
-      else {
-        str = mputstr(str, "ttcn_buffer.get_string(remaining_stream);\n");
-      }
-      str = mputprintf(str,
-        "TTCN_Logger::begin_event(TTCN_WARNING);\n"
-        "TTCN_Logger::log_event_str(\"%s(): Warning: Data remained at the end "
-          "of the stream after successful decoding: \");\n"
-        "remaining_stream.log();\n"
-        "TTCN_Logger::end_event();\n"
-        "}\n", function_name);
+        "OCTETSTRING tmp_os;\n"
+        "ttcn_buffer.get_string(tmp_os);\n"
+        "TTCN_Logger::begin_event_log2str();\n"
+        "%s.log();\n"
+        "CHARSTRING remaining_stream = TTCN_Logger::end_event_log2str();\n"
+        "TTCN_EncDec_ErrorContext::error(TTCN_EncDec::ET_EXTRA_DATA, "
+        "\"%s(): Data remained at the end of the stream after successful "
+        "decoding: %%s\", (const char*) remaining_stream);\n"
+        "}\n",
+        (input_type->get_type_refd_last()->get_typetype_ttcn3() ==
+        Common::Type::T_BSTR) ? "oct2bit(tmp_os)" : "tmp_os", function_name);
       // closing the block and returning the appropriate result or status code
       if (prototype == PROTOTYPE_BACKTRACK) {
         if (debugger_active) {
diff --git a/compiler2/ttcn3/Ttcnstuff.cc b/compiler2/ttcn3/Ttcnstuff.cc
index f52495188..2d714f8dc 100644
--- a/compiler2/ttcn3/Ttcnstuff.cc
+++ b/compiler2/ttcn3/Ttcnstuff.cc
@@ -132,7 +132,8 @@ namespace Ttcn {
           "INVAL_MSG", "REPR", "CONSTRAINT", "TAG", "SUPERFL", "EXTENSION",
           "DEC_ENUM", "DEC_DUPFLD", "DEC_MISSFLD", "DEC_OPENTYPE", "DEC_UCSTR",
           "LEN_ERR", "SIGN_ERR", "INCOMP_ORDER", "TOKEN_ERR", "LOG_MATCHING",
-          "FLOAT_TR", "FLOAT_NAN", "OMITTED_TAG", "NEGTEST_CONFL", NULL };
+          "FLOAT_TR", "FLOAT_NAN", "OMITTED_TAG", "NEGTEST_CONFL", "EXTRA_DATA",
+          NULL };
         bool type_found = false;
         for (const char * const *str = valid_types; *str; str++) {
           if (error_type == *str) {
diff --git a/core/Encdec.cc b/core/Encdec.cc
index 2ec117d24..5ca573705 100644
--- a/core/Encdec.cc
+++ b/core/Encdec.cc
@@ -57,7 +57,8 @@ TTCN_EncDec::default_error_behavior[TTCN_EncDec::ET_ALL] = {
   TTCN_EncDec::EB_WARNING,
   TTCN_EncDec::EB_ERROR,
   TTCN_EncDec::EB_ERROR,
-  TTCN_EncDec::EB_ERROR
+  TTCN_EncDec::EB_ERROR,
+  TTCN_EncDec::EB_WARNING
 };
 
 TTCN_EncDec::error_behavior_t
@@ -87,7 +88,8 @@ TTCN_EncDec::error_behavior[TTCN_EncDec::ET_ALL] = {
   TTCN_EncDec::EB_WARNING,
   TTCN_EncDec::EB_ERROR,
   TTCN_EncDec::EB_ERROR,
-  TTCN_EncDec::EB_ERROR
+  TTCN_EncDec::EB_ERROR,
+  TTCN_EncDec::EB_WARNING
 };
 
 TTCN_EncDec::error_type_t TTCN_EncDec::last_error_type=ET_NONE;
diff --git a/core/Encdec.hh b/core/Encdec.hh
index b65660d9a..68be2fa2d 100644
--- a/core/Encdec.hh
+++ b/core/Encdec.hh
@@ -104,7 +104,8 @@ public:
     ET_OMITTED_TAG,   /**< During encoding the key of a tag references
                            an optional field with omitted value */
     ET_NEGTEST_CONFL, /**< Contradictory negative testing and RAW attributes. */
-    ET_ALL,           /**< Used only when setting error behavior. 26 */
+    ET_EXTRA_DATA,    /**< Data remained after decoding. */
+    ET_ALL,           /**< Used only when setting error behavior. 27 */
     ET_INTERNAL,      /**< Internal error. Error behavior cannot be set
                            for this. */
     ET_NONE           /**< There was no error. */
-- 
GitLab