Commit e6e61afe authored by Michael Meskes's avatar Michael Meskes

Fixed some memory bugs that somehow reappeared.

Also fixed a new Coverity report.
parent 7c9e2c75
......@@ -2080,5 +2080,7 @@ Tu Aug 8 13:26:25 CEST 2006
We Aug 9 09:28:56 CEST 2006
- Fixed error handling in numeric conversion (Joachim).
- Fixed some memory bugs that somehow reappeared.
- Also fixed a new Coverity report.
- Set ecpg library version to 5.2.
- Set ecpg version to 4.2.1.
/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.57 2006/08/08 15:30:39 meskes Exp $ */
/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.58 2006/08/09 09:08:31 meskes Exp $ */
/*
* The aim is to get a simpler inteface to the database routines.
......@@ -1018,6 +1018,7 @@ ECPGstore_input(const int lineno, const bool force_indicator, const struct varia
strcpy(mallocedval + strlen(mallocedval), "date ");
strncpy(mallocedval + strlen(mallocedval), str, slen + 1);
strcpy(mallocedval + strlen(mallocedval), ",");
ECPGfree(str);
}
strcpy(mallocedval + strlen(mallocedval) - 1, "]");
}
......@@ -1037,11 +1038,11 @@ ECPGstore_input(const int lineno, const bool force_indicator, const struct varia
strcpy(mallocedval, "date ");
/* also copy trailing '\0' */
strncpy(mallocedval + strlen(mallocedval), str, slen + 1);
ECPGfree(str);
}
*tobeinserted_p = mallocedval;
*malloced_p = true;
ECPGfree(str);
}
break;
......@@ -1072,6 +1073,7 @@ ECPGstore_input(const int lineno, const bool force_indicator, const struct varia
strcpy(mallocedval + strlen(mallocedval), "timestamp ");
strncpy(mallocedval + strlen(mallocedval), str, slen + 1);
strcpy(mallocedval + strlen(mallocedval), ",");
ECPGfree(str);
}
strcpy(mallocedval + strlen(mallocedval) - 1, "]");
}
......@@ -1091,11 +1093,11 @@ ECPGstore_input(const int lineno, const bool force_indicator, const struct varia
strcpy(mallocedval, "timestamp ");
/* also copy trailing '\0' */
strncpy(mallocedval + strlen(mallocedval), str, slen + 1);
ECPGfree(str);
}
*tobeinserted_p = mallocedval;
*malloced_p = true;
ECPGfree(str);
}
break;
......
/* $PostgreSQL: pgsql/src/interfaces/ecpg/pgtypeslib/numeric.c,v 1.29 2006/08/09 07:30:56 meskes Exp $ */
/* $PostgreSQL: pgsql/src/interfaces/ecpg/pgtypeslib/numeric.c,v 1.30 2006/08/09 09:08:31 meskes Exp $ */
#include "postgres_fe.h"
#include <ctype.h>
......@@ -405,7 +405,10 @@ PGTYPESnumeric_to_asc(numeric *num, int dscale)
dscale = num->dscale;
if (PGTYPESnumeric_copy(num, numcopy) < 0)
{
PGTYPESnumeric_free(numcopy);
return NULL;
}
/* get_str_from_var may change its argument */
s = get_str_from_var(numcopy, dscale);
PGTYPESnumeric_free(numcopy);
......@@ -1465,15 +1468,18 @@ PGTYPESnumeric_from_double(double d, numeric *dst)
{
char buffer[100];
numeric *tmp;
int i;
if (sprintf(buffer, "%f", d) == 0)
return -1;
if ((tmp = PGTYPESnumeric_from_asc(buffer, NULL)) == NULL)
return -1;
if (PGTYPESnumeric_copy(tmp, dst) != 0)
return -1;
i = PGTYPESnumeric_copy(tmp, dst);
PGTYPESnumeric_free(tmp);
if (i != 0)
return -1;
errno = 0;
return 0;
}
......@@ -1485,14 +1491,19 @@ numericvar_to_double(numeric *var, double *dp)
double val;
char *endptr;
numeric *varcopy = PGTYPESnumeric_new();
int i;
if (PGTYPESnumeric_copy(var, varcopy) < 0)
{
PGTYPESnumeric_free(varcopy);
return -1;
if ((tmp = get_str_from_var(varcopy, varcopy->dscale)) == NULL)
return -1;
}
tmp = get_str_from_var(varcopy, varcopy->dscale);
PGTYPESnumeric_free(varcopy);
if (tmp == NULL)
return -1;
/*
* strtod seems to not reset errno to 0 in case of success.
* at least on aome architectures
......
/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/type.c,v 1.69 2006/07/30 16:28:58 meskes Exp $ */
/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/type.c,v 1.70 2006/08/09 09:08:32 meskes Exp $ */
#include "postgres_fe.h"
......@@ -286,14 +286,16 @@ ECPGdump_a_type(FILE *o, const char *name, struct ECPGtype * type,
mmerror(INDICATOR_NOT_SIMPLE, ET_FATAL, "Indicator for simple datatype has to be simple.\n");
ECPGdump_a_simple(o, name, type->type, make_str("1"), (arr_str_siz && strcmp(arr_str_siz, "0") != 0) ? arr_str_siz : make_str("1"), struct_sizeof, prefix);
ECPGdump_a_simple(o, ind_name, ind_type->type, ind_type->size, (arr_str_siz && strcmp(arr_str_siz, "0") != 0) ? arr_str_siz : make_str("-1"), ind_struct_sizeof, ind_prefix);
if (ind_type != NULL)
ECPGdump_a_simple(o, ind_name, ind_type->type, ind_type->size, (arr_str_siz && strcmp(arr_str_siz, "0") != 0) ? arr_str_siz : make_str("-1"), ind_struct_sizeof, ind_prefix);
break;
case ECPGt_descriptor:
if (indicator_set && (ind_type->type == ECPGt_struct || ind_type->type == ECPGt_array))
mmerror(INDICATOR_NOT_SIMPLE, ET_FATAL, "Indicator for simple datatype has to be simple.\n");
ECPGdump_a_simple(o, name, type->type, NULL, make_str("-1"), NULL, prefix);
ECPGdump_a_simple(o, ind_name, ind_type->type, ind_type->size, make_str("-1"), NULL, ind_prefix);
if (ind_type != NULL)
ECPGdump_a_simple(o, ind_name, ind_type->type, ind_type->size, make_str("-1"), NULL, ind_prefix);
break;
default:
if (indicator_set && (ind_type->type == ECPGt_struct || ind_type->type == ECPGt_array))
......
......@@ -55,9 +55,11 @@ main(void)
num = PGTYPESnumeric_from_asc(nums[i], &endptr);
check_errno();
if (endptr != NULL)
{
printf("endptr of %d is not NULL\n", i);
if (*endptr != '\0')
printf("*endptr of %d is not \\0\n", i);
if (*endptr != '\0')
printf("*endptr of %d is not \\0\n", i);
}
text = PGTYPESnumeric_to_asc(num, -1);
check_errno();
printf("num[%d,1]: %s\n", i, text); free(text);
......
......@@ -270,7 +270,7 @@ if (sqlca.sqlcode < 0) error ( );}
printf("%d Columns\n",COUNT);
for (INDEX=1;INDEX<=COUNT;++INDEX)
{
/* :NULLABLE=nullable, */{ ECPGget_desc(__LINE__, "MYDESC", INDEX,ECPGd_ret_octet,
{ ECPGget_desc(__LINE__, "MYDESC", INDEX,ECPGd_ret_octet,
ECPGt_int,&(RETURNED_OCTET_LENGTH),(long)1,(long)1,sizeof(int), ECPGd_name,
ECPGt_char,(NAME),(long)120,(long)1,(120)*sizeof(char), ECPGd_scale,
ECPGt_int,&(SCALE),(long)1,(long)1,sizeof(int), ECPGd_precision,
......@@ -348,8 +348,6 @@ if (sqlca.sqlcode < 0) error ( );}
else printf("<SQL3 %d> ",TYPE);
break;
}
/* nullable is not yet implemented in ecpg */
/* if (!NULLABLE) printf("not null "); */
if (OCTET_LENGTH>0) printf("[%d bytes]",OCTET_LENGTH);
putchar('\n');
}
......@@ -365,10 +363,10 @@ if (sqlca.sqlcode < 0) error ( );}
ECPGt_int,&(SCALE),(long)1,(long)1,sizeof(int), ECPGd_type,
ECPGt_int,&(TYPE),(long)1,(long)1,sizeof(int), ECPGd_EODT);
#line 138 "dyntest.pgc"
#line 136 "dyntest.pgc"
if (sqlca.sqlcode < 0) error ( );}
#line 138 "dyntest.pgc"
#line 136 "dyntest.pgc"
if (INDICATOR==-1) printf("NULL");
else switch (TYPE)
......@@ -376,10 +374,10 @@ if (sqlca.sqlcode < 0) error ( );}
{ ECPGget_desc(__LINE__, "MYDESC", INDEX,ECPGd_data,
ECPGt_bool,&(BOOLVAR),(long)1,(long)1,sizeof(bool), ECPGd_EODT);
#line 142 "dyntest.pgc"
#line 140 "dyntest.pgc"
if (sqlca.sqlcode < 0) error ( );}
#line 142 "dyntest.pgc"
#line 140 "dyntest.pgc"
printf(BOOLVAR?"true":"false");
break;
......@@ -389,10 +387,10 @@ if (sqlca.sqlcode < 0) error ( );}
{ { ECPGget_desc(__LINE__, "MYDESC", INDEX,ECPGd_data,
ECPGt_int,&(INTVAR),(long)1,(long)1,sizeof(int), ECPGd_EODT);
#line 148 "dyntest.pgc"
#line 146 "dyntest.pgc"
if (sqlca.sqlcode < 0) error ( );}
#line 148 "dyntest.pgc"
#line 146 "dyntest.pgc"
printf("%*d",PRECISION,INTVAR);
}
......@@ -400,10 +398,10 @@ if (sqlca.sqlcode < 0) error ( );}
{ { ECPGget_desc(__LINE__, "MYDESC", INDEX,ECPGd_data,
ECPGt_float,&(FLOATVAR),(long)1,(long)1,sizeof(float), ECPGd_EODT);
#line 152 "dyntest.pgc"
#line 150 "dyntest.pgc"
if (sqlca.sqlcode < 0) error ( );}
#line 152 "dyntest.pgc"
#line 150 "dyntest.pgc"
printf("%*.*f",PRECISION+1,SCALE,FLOATVAR);
}
......@@ -413,10 +411,10 @@ if (sqlca.sqlcode < 0) error ( );}
{ ECPGget_desc(__LINE__, "MYDESC", INDEX,ECPGd_data,
ECPGt_int,&(INTVAR),(long)1,(long)1,sizeof(int), ECPGd_EODT);
#line 158 "dyntest.pgc"
#line 156 "dyntest.pgc"
if (sqlca.sqlcode < 0) error ( );}
#line 158 "dyntest.pgc"
#line 156 "dyntest.pgc"
printf("%d",INTVAR);
break;
......@@ -425,10 +423,10 @@ if (sqlca.sqlcode < 0) error ( );}
{ ECPGget_desc(__LINE__, "MYDESC", INDEX,ECPGd_data,
ECPGt_float,&(FLOATVAR),(long)1,(long)1,sizeof(float), ECPGd_EODT);
#line 163 "dyntest.pgc"
#line 161 "dyntest.pgc"
if (sqlca.sqlcode < 0) error ( );}
#line 163 "dyntest.pgc"
#line 161 "dyntest.pgc"
printf("%f",FLOATVAR);
break;
......@@ -436,10 +434,10 @@ if (sqlca.sqlcode < 0) error ( );}
{ ECPGget_desc(__LINE__, "MYDESC", INDEX,ECPGd_data,
ECPGt_double,&(DOUBLEVAR),(long)1,(long)1,sizeof(double), ECPGd_EODT);
#line 167 "dyntest.pgc"
#line 165 "dyntest.pgc"
if (sqlca.sqlcode < 0) error ( );}
#line 167 "dyntest.pgc"
#line 165 "dyntest.pgc"
printf("%f",DOUBLEVAR);
break;
......@@ -451,10 +449,10 @@ if (sqlca.sqlcode < 0) error ( );}
{ ECPGget_desc(__LINE__, "MYDESC", INDEX,ECPGd_data,
ECPGt_char,(STRINGVAR),(long)1024,(long)1,(1024)*sizeof(char), ECPGd_EODT);
#line 175 "dyntest.pgc"
#line 173 "dyntest.pgc"
if (sqlca.sqlcode < 0) error ( );}
#line 175 "dyntest.pgc"
#line 173 "dyntest.pgc"
printf("'%s'",STRINGVAR);
break;
......@@ -465,16 +463,16 @@ if (sqlca.sqlcode < 0) error ( );}
}
{ ECPGdo(__LINE__, 0, 1, NULL, "close MYCURS", ECPGt_EOIT, ECPGt_EORT);
#line 184 "dyntest.pgc"
#line 182 "dyntest.pgc"
if (sqlca.sqlcode < 0) error ( );}
#line 184 "dyntest.pgc"
#line 182 "dyntest.pgc"
ECPGdeallocate_desc(__LINE__, "MYDESC");
#line 185 "dyntest.pgc"
#line 183 "dyntest.pgc"
if (sqlca.sqlcode < 0) error ( );
#line 185 "dyntest.pgc"
#line 183 "dyntest.pgc"
/* no exec sql disconnect; */
......
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -37,9 +37,11 @@ main(void)
num = PGTYPESnumeric_from_asc(nums[i], &endptr);
check_errno();
if (endptr != NULL)
{
printf("endptr of %d is not NULL\n", i);
if (*endptr != '\0')
printf("*endptr of %d is not \\0\n", i);
if (*endptr != '\0')
printf("*endptr of %d is not \\0\n", i);
}
text = PGTYPESnumeric_to_asc(num, -1);
check_errno();
printf("num[%d,1]: %s\n", i, text); free(text);
......
......@@ -62,7 +62,7 @@ int main(int argc,char **argv)
:TYPE = type,
:LENGTH = length, :OCTET_LENGTH=octet_length,
:PRECISION = precision, :SCALE=scale,
/* :NULLABLE=nullable, */ :NAME=name,
:NAME=name,
:RETURNED_OCTET_LENGTH=returned_octet_length;
printf("%s ",NAME);
switch (TYPE)
......@@ -122,8 +122,6 @@ int main(int argc,char **argv)
else printf("<SQL3 %d> ",TYPE);
break;
}
/* nullable is not yet implemented in ecpg */
/* if (!NULLABLE) printf("not null "); */
if (OCTET_LENGTH>0) printf("[%d bytes]",OCTET_LENGTH);
putchar('\n');
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment