]> granicus.if.org Git - postgresql/commitdiff
Fixed potentially uninitialized memory bug in compatlib.
authorMichael Meskes <meskes@postgresql.org>
Mon, 3 Nov 2003 14:44:28 +0000 (14:44 +0000)
committerMichael Meskes <meskes@postgresql.org>
Mon, 3 Nov 2003 14:44:28 +0000 (14:44 +0000)
src/interfaces/ecpg/ChangeLog
src/interfaces/ecpg/compatlib/informix.c

index cec336d6d7b7b892ef23860e00abb99763175f3e..632c4c9565353f7fff6248ad8a8b9abf64ea8ca4 100644 (file)
@@ -1705,6 +1705,10 @@ Thu Oct 30 11:12:37 CET 2003
 Fri Oct 31 15:09:22 CET 2003
 
        - If EOF is found inside a string/comment/etc. stop parsing.
+       
+Mon Nov  3 15:43:19 CET 2003
+
+       - Fixed a potentially uncleared allocation in compatlib.
        - Set ecpg version to 3.0.0
        - Set ecpg library to 4.0.0
        - Set pgtypes library to 1.0.0
index 9b7a99fc65633c83ad55e347c252302d55a2f033..689e58b100fe397c416b40311b19991543bddf0d 100644 (file)
@@ -3,6 +3,7 @@
 #include <errno.h>
 #include <math.h>
 #include <ctype.h>
+#include <limits.h>
 
 #include <ecpgtype.h>
 #include <compatlib.h>
@@ -11,7 +12,7 @@
 #include <pgtypes_numeric.h>
 #include <sqltypes.h>
 
-char      *ECPGalloc(long, int);
+char       *ECPGalloc(long, int);
 
 static int
 deccall2(decimal * arg1, decimal * arg2, int (*ptr) (numeric *, numeric *))
@@ -659,41 +660,50 @@ static struct
 }      value;
 
 /**
- * initialize the struct, wich holds the different forms
+ * initialize the struct, which holds the different forms
  * of the long value
  */
 static void
-initValue(long lng_val)
-{
-       int                     i,
-                               div,
-                               dig;
-       char            tmp[2] = " ";
-
-       /* set some obvious things */
-       value.val = lng_val >= 0 ? lng_val : lng_val * (-1);
-       value.sign = lng_val >= 0 ? '+' : '-';
-       value.maxdigits = log10(2) * (8 * sizeof(long) - 1);
-
-       /* determine the number of digits */
-       for (i = 0; i <= value.maxdigits; i++)
-       {
-               if ((int) (value.val / pow(10, i)) != 0)
-                       value.digits = i + 1;
-       }
-       value.remaining = value.digits;
-
-       /* convert the long to string */
-       value.val_string = (char *) malloc(value.digits + 1);
-       for (i = value.digits; i > 0; i--)
-       {
-               div = pow(10, i);
-               dig = (value.val % div) / (div / 10);
-               tmp[0] = (char) (dig + 48);
-               strcat(value.val_string, tmp);
-       }
-       /* safety-net */
-       value.val_string[value.digits] = '\0';
+initValue (long lng_val)
+{
+  int i, j;
+  long l, dig;
+
+  /* set some obvious things */
+  value.val = lng_val >= 0 ? lng_val : lng_val * (-1);
+  value.sign = lng_val >= 0 ? '+' : '-';
+  value.maxdigits = log10 (2) * (8 * sizeof (long) - 1);
+
+  /* determine the number of digits */
+  i = 0;
+  l = 1;
+  do
+    {
+      i++;
+      l *= 10;
+    }
+  while ((l - 1) < value.val && l <= LONG_MAX / 10);
+
+  if (l <= LONG_MAX/10) 
+  {
+         value.digits = i;
+         l /= 10;
+  }
+  else
+         value.digits = i + 1;
+
+  value.remaining = value.digits;
+
+  /* convert the long to string */
+  value.val_string = (char *) malloc (value.digits + 1);
+  dig = value.val;
+  for (i = value.digits, j = 0; i > 0; i--, j++)
+    {
+       value.val_string[j] = dig/l + '0';
+       dig = dig % l;
+       l /= 10; 
+    }
+  value.val_string[value.digits] = '\0';
 }
 
 /* return the position oft the right-most dot in some string */