diff options
author | Michael Meskes <meskes@postgresql.org> | 2003-11-03 14:44:28 +0000 |
---|---|---|
committer | Michael Meskes <meskes@postgresql.org> | 2003-11-03 14:44:28 +0000 |
commit | 90e53f0c16d96466488f95b85f6ff276a13c962e (patch) | |
tree | aa883652f3714f264993b73e0e48e381f11a18dd /src/interfaces/ecpg/compatlib/informix.c | |
parent | 0637d52d1fa8373849e67498192eb06ec0e25a60 (diff) | |
download | postgresql-90e53f0c16d96466488f95b85f6ff276a13c962e.tar.gz postgresql-90e53f0c16d96466488f95b85f6ff276a13c962e.zip |
Fixed potentially uninitialized memory bug in compatlib.
Diffstat (limited to 'src/interfaces/ecpg/compatlib/informix.c')
-rw-r--r-- | src/interfaces/ecpg/compatlib/informix.c | 76 |
1 files changed, 43 insertions, 33 deletions
diff --git a/src/interfaces/ecpg/compatlib/informix.c b/src/interfaces/ecpg/compatlib/informix.c index 9b7a99fc656..689e58b100f 100644 --- a/src/interfaces/ecpg/compatlib/informix.c +++ b/src/interfaces/ecpg/compatlib/informix.c @@ -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 */ |