Repository: incubator-trafodion
Updated Branches:
  refs/heads/master 6e6d1ea41 -> 4ff25d987


Author: selvaganesang <[email protected]>
Date:   Sat Oct 28 04:27:49 2017 +0000

[TRAFODION-2785] mxosrvr dumps core generated when loading data from Oracle to 
Trafodion at times

When there is an error while loading the data, the hexadecimal representation
of character column upto 254 bytes is shown as part of the error message.

The function stringToHex had a subtle bug that can cause buffer overrun 
resulting in stack corruption.

This closes #1280


Project: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-trafodion/commit/4ff25d98
Tree: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/tree/4ff25d98
Diff: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/diff/4ff25d98

Branch: refs/heads/master
Commit: 4ff25d987761958e2bd4f42ac997b876935bc9db
Parents: 6e6d1ea
Author: selvaganesang <[email protected]>
Authored: Mon Oct 30 23:14:08 2017 +0000
Committer: selvaganesang <[email protected]>
Committed: Mon Oct 30 23:15:26 2017 +0000

----------------------------------------------------------------------
 core/sql/exp/ExpError.cpp | 17 +++++++++--------
 1 file changed, 9 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/4ff25d98/core/sql/exp/ExpError.cpp
----------------------------------------------------------------------
diff --git a/core/sql/exp/ExpError.cpp b/core/sql/exp/ExpError.cpp
index 2105f2f..b9d03f5 100644
--- a/core/sql/exp/ExpError.cpp
+++ b/core/sql/exp/ExpError.cpp
@@ -608,17 +608,18 @@ ComDiagsArea *ExRaiseDetailSqlError(CollHeap* heap,
 
 char *stringToHex(char * out, Int32 outLen, char * in, Int32 inLen)
 {
-  //clear out buffer first
-  memset(out,0,outLen);
-
-  outLen = (outLen / 2) -1 ;
-
-  if(inLen < outLen) outLen = inLen;
 
+  Int32 hexLen = (outLen / 2) -1 ;
+  if (inLen < hexLen) 
+     hexLen = inLen;
+  if (hexLen < 0)
+     hexLen = 0;
+  if (outLen > 0)
+     out[0] = '\0';
   char hex[3];
-  for(int i = 0; i < outLen; i++)
+  for(int i = 0; i < hexLen; i++)
   {
-    sprintf(hex, "%02x", in[i]);
+    snprintf(hex, sizeof(hex), "%02x", (char)in[i]);
     strcat(out,hex);
   }
   return out;

Reply via email to