Skip to content

Commit 621fd4d

Browse files
author
Michael Meskes
committed
Applied another patch by Zoltan to fix memory alignement issues in ecpg's sqlda
code.
1 parent f3bbd7d commit 621fd4d

File tree

1 file changed

+19
-12
lines changed

1 file changed

+19
-12
lines changed

src/interfaces/ecpg/ecpglib/sqlda.c

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ sqlda_common_total_size(const PGresult *res, int row, enum COMPAT_MODE compat, l
110110
* int Unfortunately we need to do double work here to compute
111111
* the size of the space needed for the numeric structure.
112112
*/
113-
ecpg_sqlda_align_add_size(offset, sizeof(int), sizeof(numeric), &offset, &next_offset);
113+
ecpg_sqlda_align_add_size(offset, sizeof(NumericDigit *), sizeof(numeric), &offset, &next_offset);
114114
if (!PQgetisnull(res, row, i))
115115
{
116116
char *val = PQgetvalue(res, row, i);
@@ -119,7 +119,8 @@ sqlda_common_total_size(const PGresult *res, int row, enum COMPAT_MODE compat, l
119119
num = PGTYPESnumeric_from_asc(val, NULL);
120120
if (!num)
121121
break;
122-
ecpg_sqlda_align_add_size(next_offset, sizeof(int), num->ndigits + 1, &offset, &next_offset);
122+
if (num->ndigits)
123+
ecpg_sqlda_align_add_size(next_offset, sizeof(int), num->ndigits + 1, &offset, &next_offset);
123124
PGTYPESnumeric_free(num);
124125
}
125126
break;
@@ -318,7 +319,7 @@ ecpg_set_compat_sqlda(int lineno, struct sqlda_compat ** _sqlda, const PGresult
318319

319320
set_data = false;
320321

321-
ecpg_sqlda_align_add_size(offset, sizeof(int), sizeof(numeric), &offset, &next_offset);
322+
ecpg_sqlda_align_add_size(offset, sizeof(NumericDigit *), sizeof(numeric), &offset, &next_offset);
322323
sqlda->sqlvar[i].sqldata = (char *) sqlda + offset;
323324
sqlda->sqlvar[i].sqllen = sizeof(numeric);
324325

@@ -338,11 +339,14 @@ ecpg_set_compat_sqlda(int lineno, struct sqlda_compat ** _sqlda, const PGresult
338339

339340
memcpy(sqlda->sqlvar[i].sqldata, num, sizeof(numeric));
340341

341-
ecpg_sqlda_align_add_size(next_offset, sizeof(int), num->ndigits + 1, &offset, &next_offset);
342-
memcpy((char *) sqlda + offset, num->buf, num->ndigits + 1);
342+
if (num->ndigits)
343+
{
344+
ecpg_sqlda_align_add_size(next_offset, sizeof(int), num->ndigits + 1, &offset, &next_offset);
345+
memcpy((char *) sqlda + offset, num->buf, num->ndigits + 1);
343346

344-
((numeric *) sqlda->sqlvar[i].sqldata)->buf = (NumericDigit *) sqlda + offset;
345-
((numeric *) sqlda->sqlvar[i].sqldata)->digits = (NumericDigit *) sqlda + offset + (num->digits - num->buf);
347+
((numeric *) sqlda->sqlvar[i].sqldata)->buf = (NumericDigit *) sqlda + offset;
348+
((numeric *) sqlda->sqlvar[i].sqldata)->digits = (NumericDigit *) sqlda + offset + (num->digits - num->buf);
349+
}
346350

347351
PGTYPESnumeric_free(num);
348352

@@ -504,7 +508,7 @@ ecpg_set_native_sqlda(int lineno, struct sqlda_struct ** _sqlda, const PGresult
504508

505509
set_data = false;
506510

507-
ecpg_sqlda_align_add_size(offset, sizeof(int), sizeof(numeric), &offset, &next_offset);
511+
ecpg_sqlda_align_add_size(offset, sizeof(NumericDigit *), sizeof(numeric), &offset, &next_offset);
508512
sqlda->sqlvar[i].sqldata = (char *) sqlda + offset;
509513
sqlda->sqlvar[i].sqllen = sizeof(numeric);
510514

@@ -524,11 +528,14 @@ ecpg_set_native_sqlda(int lineno, struct sqlda_struct ** _sqlda, const PGresult
524528

525529
memcpy(sqlda->sqlvar[i].sqldata, num, sizeof(numeric));
526530

527-
ecpg_sqlda_align_add_size(next_offset, sizeof(int), num->ndigits + 1, &offset, &next_offset);
528-
memcpy((char *) sqlda + offset, num->buf, num->ndigits + 1);
531+
if (num->ndigits)
532+
{
533+
ecpg_sqlda_align_add_size(next_offset, sizeof(int), num->ndigits + 1, &offset, &next_offset);
534+
memcpy((char *) sqlda + offset, num->buf, num->ndigits + 1);
529535

530-
((numeric *) sqlda->sqlvar[i].sqldata)->buf = (NumericDigit *) sqlda + offset;
531-
((numeric *) sqlda->sqlvar[i].sqldata)->digits = (NumericDigit *) sqlda + offset + (num->digits - num->buf);
536+
((numeric *) sqlda->sqlvar[i].sqldata)->buf = (NumericDigit *) sqlda + offset;
537+
((numeric *) sqlda->sqlvar[i].sqldata)->digits = (NumericDigit *) sqlda + offset + (num->digits - num->buf);
538+
}
532539

533540
PGTYPESnumeric_free(num);
534541

0 commit comments

Comments
 (0)