tags 413534 patch thanks Hi Peter,
I've had a chance now to look over Stephen's proposed bugfix. I haven't verified that this is a complete fix for all related 64-bit issues, but I agree that there are 64-bit problems in this code and that his/upstream's changes appear to be a correct, minimal fix for the problem he's running into. I'm therefore going to go ahead and NMU a fix for this bug using Stephen's patch. The full NMU diff is attached; it will be uploaded to incoming shortly. Thanks, -- Steve Langasek Give me a lever long enough and a Free OS Debian Developer to set it on, and I can move the world. [EMAIL PROTECTED] http://www.debian.org/
diff -u psqlodbc-08.01.0200/debian/changelog psqlodbc-08.01.0200/debian/changelog --- psqlodbc-08.01.0200/debian/changelog +++ psqlodbc-08.01.0200/debian/changelog @@ -1,3 +1,11 @@ +psqlodbc (1:08.01.0200-2.1) unstable; urgency=high + + * Non-maintainer upload. + * High-urgency upload for RC bugfix. + * Fix the signature of SQLGetData on 64-bit architectures. + + -- Steve Langasek <[EMAIL PROTECTED]> Mon, 5 Mar 2007 22:28:19 -0800 + psqlodbc (1:08.01.0200-2) unstable; urgency=low * Fix to build on 64-bit architectures (closes: #358949) only in patch2: unchanged: --- psqlodbc-08.01.0200.orig/debian/patches/psqlodbc-413534.diff +++ psqlodbc-08.01.0200/debian/patches/psqlodbc-413534.diff @@ -0,0 +1,135 @@ +diff -ur psqlodbc-08.01.0200.orig/convert.c psqlodbc-08.01.0200/convert.c +--- psqlodbc-08.01.0200.orig/convert.c 2007-03-07 12:10:01.000000000 -0500 ++++ psqlodbc-08.01.0200/convert.c 2007-03-07 12:10:17.000000000 -0500 +@@ -379,14 +379,14 @@ + + SC_set_current_col(stmt, -1); + return copy_and_convert_field(stmt, field_type, value, (Int2) bic->returntype, (PTR) (bic->buffer + offset), +- (SDWORD) bic->buflen, (bic->used + (offset >> 2))); ++ bic->buflen, (bic->used + (offset >> 2))); + } + + + /* This is called by SQLGetData() */ + int + copy_and_convert_field(StatementClass *stmt, Int4 field_type, void *value, Int2 fCType, +- PTR rgbValue, SDWORD cbValueMax, SQLLEN *pcbValue) ++ PTR rgbValue, SQLLEN cbValueMax, SQLLEN *pcbValue) + { + CSTR func = "copy_and_convert_field"; + ARDFields *opts = SC_get_ARDF(stmt); +@@ -454,7 +454,7 @@ + pcbValueOffset = rgbValueOffset = (bind_size * bind_row); + else + { +- pcbValueOffset = bind_row * sizeof(SDWORD); ++ pcbValueOffset = bind_row * sizeof(SQLLEN); + rgbValueOffset = bind_row * cbValueMax; + } + /* +@@ -486,7 +486,7 @@ + */ + if (pcbValue) + { +- *((SDWORD *) pcbValueBindRow) = SQL_NULL_DATA; ++ *((SQLLEN *) pcbValueBindRow) = SQL_NULL_DATA; + return COPY_OK; + } + else +@@ -663,7 +663,7 @@ + + /* There is no corresponding fCType for this. */ + if (pcbValue) +- *((SDWORD *) pcbValueBindRow) = len; ++ *((SQLLEN *) pcbValueBindRow) = len; + + return COPY_OK; /* dont go any further or the data will be + * trashed */ +@@ -675,13 +675,13 @@ + */ + case PG_TYPE_LO_UNDEFINED: + +- return convert_lo(stmt, value, fCType, rgbValueBindRow, cbValueMax, (SDWORD *) pcbValueBindRow); ++ return convert_lo(stmt, value, fCType, rgbValueBindRow, cbValueMax, (SQLLEN *) pcbValueBindRow); + + default: + + if (field_type == stmt->hdbc->lobj_type) /* hack until permanent + * type available */ +- return convert_lo(stmt, value, fCType, rgbValueBindRow, cbValueMax, (SDWORD *) pcbValueBindRow); ++ return convert_lo(stmt, value, fCType, rgbValueBindRow, cbValueMax, (SQLLEN *) pcbValueBindRow); + } + + /* Change default into something useable */ +@@ -956,13 +956,13 @@ + { + char *str = strdup(rgbValueBindRow); + UInt4 ucount = utf8_to_ucs2(str, len, (SQLWCHAR *) rgbValueBindRow, cbValueMax / WCLEN); +- if (cbValueMax < (SDWORD) (WCLEN * ucount)) ++ if (cbValueMax < WCLEN * ucount) + result = COPY_RESULT_TRUNCATED; + free(str); + } + else + { +- if ((SDWORD) (len + WCLEN) <= cbValueMax) ++ if (len + WCLEN <= cbValueMax) + { + result = COPY_OK; + } +@@ -1263,7 +1263,7 @@ + if (neut_str) + len = strlen(neut_str); + if (pcbValue) +- *((SDWORD *) pcbValueBindRow) = len; ++ *((SQLLEN *) pcbValueBindRow) = len; + if (len > 0 && cbValueMax > 0) + { + memcpy(rgbValueBindRow, neut_str, len < cbValueMax ? len : cbValueMax); +@@ -1282,7 +1282,7 @@ + + inolog("SQL_C_VARBOOKMARK value=%d\n", ival); + if (pcbValue) +- *((SDWORD *) pcbValueBindRow) = sizeof(ival); ++ *((SQLLEN *) pcbValueBindRow) = sizeof(ival); + if (cbValueMax >= sizeof(ival)) + { + memcpy(rgbValueBindRow, &ival, sizeof(ival)); +@@ -1381,7 +1381,7 @@ + + /* store the length of what was copied, if there's a place for it */ + if (pcbValue) +- *((SDWORD *) pcbValueBindRow) = len; ++ *((SQLLEN *) pcbValueBindRow) = len; + + if (result == COPY_OK && stmt->current_col >= 0) + gdata->gdata[stmt->current_col].data_left = 0; +@@ -3873,7 +3873,7 @@ + */ + int + convert_lo(StatementClass *stmt, const void *value, Int2 fCType, PTR rgbValue, +- SDWORD cbValueMax, SDWORD *pcbValue) ++ SQLLEN cbValueMax, SQLLEN *pcbValue) + { + Oid oid; + int retval, +diff -ur psqlodbc-08.01.0200.orig/convert.h psqlodbc-08.01.0200/convert.h +--- psqlodbc-08.01.0200.orig/convert.h 2007-03-07 12:10:01.000000000 -0500 ++++ psqlodbc-08.01.0200/convert.h 2007-03-07 12:10:17.000000000 -0500 +@@ -37,7 +37,7 @@ + + int copy_and_convert_field_bindinfo(StatementClass *stmt, Int4 field_type, void *value, int col); + int copy_and_convert_field(StatementClass *stmt, Int4 field_type, void *value, Int2 fCType, +- PTR rgbValue, SDWORD cbValueMax, SQLLEN *pcbValue); ++ PTR rgbValue, SQLLEN cbValueMax, SQLLEN *pcbValue); + + int copy_statement_with_parameters(StatementClass *stmt, BOOL); + BOOL convert_money(const char *s, char *sout, size_t soutmax); +@@ -52,6 +52,6 @@ + void encode(const char *in, char *out); + void decode(const char *in, char *out); + int convert_lo(StatementClass *stmt, const void *value, Int2 fCType, PTR rgbValue, +- SDWORD cbValueMax, SDWORD *pcbValue); ++ SQLLEN cbValueMax, SQLLEN *pcbValue); + + #endif