mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-01-30 19:00:29 +08:00
Backported buffer overrun fix from HEAD
This commit is contained in:
parent
95a5a29845
commit
2d280ef3fb
@ -1,4 +1,4 @@
|
|||||||
/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.38.4.9 2006/07/05 10:50:20 meskes Exp $ */
|
/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.38.4.10 2006/08/18 16:33:50 meskes Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The aim is to get a simpler inteface to the database routines.
|
* The aim is to get a simpler inteface to the database routines.
|
||||||
@ -578,19 +578,21 @@ ECPGstore_input(const int lineno, const bool force_indicator, const struct varia
|
|||||||
}
|
}
|
||||||
if (**tobeinserted_p == '\0')
|
if (**tobeinserted_p == '\0')
|
||||||
{
|
{
|
||||||
|
int asize = var->arrsize? var->arrsize : 1;
|
||||||
|
|
||||||
switch (var->type)
|
switch (var->type)
|
||||||
{
|
{
|
||||||
int element;
|
int element;
|
||||||
|
|
||||||
case ECPGt_short:
|
case ECPGt_short:
|
||||||
if (!(mallocedval = ECPGalloc(var->arrsize * 20, lineno)))
|
if (!(mallocedval = ECPGalloc(asize * 20, lineno)))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (var->arrsize > 1)
|
if (asize > 1)
|
||||||
{
|
{
|
||||||
strcpy(mallocedval, "array [");
|
strcpy(mallocedval, "array [");
|
||||||
|
|
||||||
for (element = 0; element < var->arrsize; element++)
|
for (element = 0; element < asize; element++)
|
||||||
sprintf(mallocedval + strlen(mallocedval), "%hd,", ((short *) var->value)[element]);
|
sprintf(mallocedval + strlen(mallocedval), "%hd,", ((short *) var->value)[element]);
|
||||||
|
|
||||||
strcpy(mallocedval + strlen(mallocedval) - 1, "]");
|
strcpy(mallocedval + strlen(mallocedval) - 1, "]");
|
||||||
@ -603,14 +605,14 @@ ECPGstore_input(const int lineno, const bool force_indicator, const struct varia
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case ECPGt_int:
|
case ECPGt_int:
|
||||||
if (!(mallocedval = ECPGalloc(var->arrsize * 20, lineno)))
|
if (!(mallocedval = ECPGalloc(asize * 20, lineno)))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (var->arrsize > 1)
|
if (asize > 1)
|
||||||
{
|
{
|
||||||
strcpy(mallocedval, "array [");
|
strcpy(mallocedval, "array [");
|
||||||
|
|
||||||
for (element = 0; element < var->arrsize; element++)
|
for (element = 0; element < asize; element++)
|
||||||
sprintf(mallocedval + strlen(mallocedval), "%d,", ((int *) var->value)[element]);
|
sprintf(mallocedval + strlen(mallocedval), "%d,", ((int *) var->value)[element]);
|
||||||
|
|
||||||
strcpy(mallocedval + strlen(mallocedval) - 1, "]");
|
strcpy(mallocedval + strlen(mallocedval) - 1, "]");
|
||||||
@ -623,14 +625,14 @@ ECPGstore_input(const int lineno, const bool force_indicator, const struct varia
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case ECPGt_unsigned_short:
|
case ECPGt_unsigned_short:
|
||||||
if (!(mallocedval = ECPGalloc(var->arrsize * 20, lineno)))
|
if (!(mallocedval = ECPGalloc(asize * 20, lineno)))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (var->arrsize > 1)
|
if (asize > 1)
|
||||||
{
|
{
|
||||||
strcpy(mallocedval, "array [");
|
strcpy(mallocedval, "array [");
|
||||||
|
|
||||||
for (element = 0; element < var->arrsize; element++)
|
for (element = 0; element < asize; element++)
|
||||||
sprintf(mallocedval + strlen(mallocedval), "%hu,", ((unsigned short *) var->value)[element]);
|
sprintf(mallocedval + strlen(mallocedval), "%hu,", ((unsigned short *) var->value)[element]);
|
||||||
|
|
||||||
strcpy(mallocedval + strlen(mallocedval) - 1, "]");
|
strcpy(mallocedval + strlen(mallocedval) - 1, "]");
|
||||||
@ -643,14 +645,14 @@ ECPGstore_input(const int lineno, const bool force_indicator, const struct varia
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case ECPGt_unsigned_int:
|
case ECPGt_unsigned_int:
|
||||||
if (!(mallocedval = ECPGalloc(var->arrsize * 20, lineno)))
|
if (!(mallocedval = ECPGalloc(asize * 20, lineno)))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (var->arrsize > 1)
|
if (asize > 1)
|
||||||
{
|
{
|
||||||
strcpy(mallocedval, "array [");
|
strcpy(mallocedval, "array [");
|
||||||
|
|
||||||
for (element = 0; element < var->arrsize; element++)
|
for (element = 0; element < asize; element++)
|
||||||
sprintf(mallocedval + strlen(mallocedval), "%u,", ((unsigned int *) var->value)[element]);
|
sprintf(mallocedval + strlen(mallocedval), "%u,", ((unsigned int *) var->value)[element]);
|
||||||
|
|
||||||
strcpy(mallocedval + strlen(mallocedval) - 1, "]");
|
strcpy(mallocedval + strlen(mallocedval) - 1, "]");
|
||||||
@ -663,14 +665,14 @@ ECPGstore_input(const int lineno, const bool force_indicator, const struct varia
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case ECPGt_long:
|
case ECPGt_long:
|
||||||
if (!(mallocedval = ECPGalloc(var->arrsize * 20, lineno)))
|
if (!(mallocedval = ECPGalloc(asize * 20, lineno)))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (var->arrsize > 1)
|
if (asize > 1)
|
||||||
{
|
{
|
||||||
strcpy(mallocedval, "array [");
|
strcpy(mallocedval, "array [");
|
||||||
|
|
||||||
for (element = 0; element < var->arrsize; element++)
|
for (element = 0; element < asize; element++)
|
||||||
sprintf(mallocedval + strlen(mallocedval), "%ld,", ((long *) var->value)[element]);
|
sprintf(mallocedval + strlen(mallocedval), "%ld,", ((long *) var->value)[element]);
|
||||||
|
|
||||||
strcpy(mallocedval + strlen(mallocedval) - 1, "]");
|
strcpy(mallocedval + strlen(mallocedval) - 1, "]");
|
||||||
@ -683,14 +685,14 @@ ECPGstore_input(const int lineno, const bool force_indicator, const struct varia
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case ECPGt_unsigned_long:
|
case ECPGt_unsigned_long:
|
||||||
if (!(mallocedval = ECPGalloc(var->arrsize * 20, lineno)))
|
if (!(mallocedval = ECPGalloc(asize * 20, lineno)))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (var->arrsize > 1)
|
if (asize > 1)
|
||||||
{
|
{
|
||||||
strcpy(mallocedval, "array [");
|
strcpy(mallocedval, "array [");
|
||||||
|
|
||||||
for (element = 0; element < var->arrsize; element++)
|
for (element = 0; element < asize; element++)
|
||||||
sprintf(mallocedval + strlen(mallocedval), "%lu,", ((unsigned long *) var->value)[element]);
|
sprintf(mallocedval + strlen(mallocedval), "%lu,", ((unsigned long *) var->value)[element]);
|
||||||
|
|
||||||
strcpy(mallocedval + strlen(mallocedval) - 1, "]");
|
strcpy(mallocedval + strlen(mallocedval) - 1, "]");
|
||||||
@ -703,14 +705,14 @@ ECPGstore_input(const int lineno, const bool force_indicator, const struct varia
|
|||||||
break;
|
break;
|
||||||
#ifdef HAVE_LONG_LONG_INT_64
|
#ifdef HAVE_LONG_LONG_INT_64
|
||||||
case ECPGt_long_long:
|
case ECPGt_long_long:
|
||||||
if (!(mallocedval = ECPGalloc(var->arrsize * 30, lineno)))
|
if (!(mallocedval = ECPGalloc(asize * 30, lineno)))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (var->arrsize > 1)
|
if (asize > 1)
|
||||||
{
|
{
|
||||||
strcpy(mallocedval, "array [");
|
strcpy(mallocedval, "array [");
|
||||||
|
|
||||||
for (element = 0; element < var->arrsize; element++)
|
for (element = 0; element < asize; element++)
|
||||||
sprintf(mallocedval + strlen(mallocedval), "%lld,", ((long long *) var->value)[element]);
|
sprintf(mallocedval + strlen(mallocedval), "%lld,", ((long long *) var->value)[element]);
|
||||||
|
|
||||||
strcpy(mallocedval + strlen(mallocedval) - 1, "]");
|
strcpy(mallocedval + strlen(mallocedval) - 1, "]");
|
||||||
@ -723,14 +725,14 @@ ECPGstore_input(const int lineno, const bool force_indicator, const struct varia
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case ECPGt_unsigned_long_long:
|
case ECPGt_unsigned_long_long:
|
||||||
if (!(mallocedval = ECPGalloc(var->arrsize * 30, lineno)))
|
if (!(mallocedval = ECPGalloc(asize * 30, lineno)))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (var->arrsize > 1)
|
if (asize > 1)
|
||||||
{
|
{
|
||||||
strcpy(mallocedval, "array [");
|
strcpy(mallocedval, "array [");
|
||||||
|
|
||||||
for (element = 0; element < var->arrsize; element++)
|
for (element = 0; element < asize; element++)
|
||||||
sprintf(mallocedval + strlen(mallocedval), "%llu,", ((unsigned long long *) var->value)[element]);
|
sprintf(mallocedval + strlen(mallocedval), "%llu,", ((unsigned long long *) var->value)[element]);
|
||||||
|
|
||||||
strcpy(mallocedval + strlen(mallocedval) - 1, "]");
|
strcpy(mallocedval + strlen(mallocedval) - 1, "]");
|
||||||
@ -743,14 +745,14 @@ ECPGstore_input(const int lineno, const bool force_indicator, const struct varia
|
|||||||
break;
|
break;
|
||||||
#endif /* HAVE_LONG_LONG_INT_64 */
|
#endif /* HAVE_LONG_LONG_INT_64 */
|
||||||
case ECPGt_float:
|
case ECPGt_float:
|
||||||
if (!(mallocedval = ECPGalloc(var->arrsize * 25, lineno)))
|
if (!(mallocedval = ECPGalloc(asize * 25, lineno)))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (var->arrsize > 1)
|
if (asize > 1)
|
||||||
{
|
{
|
||||||
strcpy(mallocedval, "array [");
|
strcpy(mallocedval, "array [");
|
||||||
|
|
||||||
for (element = 0; element < var->arrsize; element++)
|
for (element = 0; element < asize; element++)
|
||||||
sprintf(mallocedval + strlen(mallocedval), "%.14g,", ((float *) var->value)[element]);
|
sprintf(mallocedval + strlen(mallocedval), "%.14g,", ((float *) var->value)[element]);
|
||||||
|
|
||||||
strcpy(mallocedval + strlen(mallocedval) - 1, "]");
|
strcpy(mallocedval + strlen(mallocedval) - 1, "]");
|
||||||
@ -763,14 +765,14 @@ ECPGstore_input(const int lineno, const bool force_indicator, const struct varia
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case ECPGt_double:
|
case ECPGt_double:
|
||||||
if (!(mallocedval = ECPGalloc(var->arrsize * 25, lineno)))
|
if (!(mallocedval = ECPGalloc(asize * 25, lineno)))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (var->arrsize > 1)
|
if (asize > 1)
|
||||||
{
|
{
|
||||||
strcpy(mallocedval, "array [");
|
strcpy(mallocedval, "array [");
|
||||||
|
|
||||||
for (element = 0; element < var->arrsize; element++)
|
for (element = 0; element < asize; element++)
|
||||||
sprintf(mallocedval + strlen(mallocedval), "%.14g,", ((double *) var->value)[element]);
|
sprintf(mallocedval + strlen(mallocedval), "%.14g,", ((double *) var->value)[element]);
|
||||||
|
|
||||||
strcpy(mallocedval + strlen(mallocedval) - 1, "]");
|
strcpy(mallocedval + strlen(mallocedval) - 1, "]");
|
||||||
|
Loading…
Reference in New Issue
Block a user