Re: com php-src: Fix bug #60616 (odbc_fetch_into returns junk at end of multi-byte char fields): ext/odbc/php_odbc.c ext/odbc/php_odbc_includes.h

From: Date: Wed, 30 Jul 2014 09:29:28 +0000
Subject: Re: com php-src: Fix bug #60616 (odbc_fetch_into returns junk at end of multi-byte char fields): ext/odbc/php_odbc.c ext/odbc/php_odbc_includes.h
References: 1  Groups: php.cvs 
Request: Send a blank email to php-cvs+get-79660@lists.php.net to get a copy of this message
On Tue, Jul 29, 2014 at 1:15 AM, Keyur Govande <keyur@php.net> wrote: > Commit: 00546bc9b7cb8208c27de9c6ebd12156401a5607 > Author: Keyur Govande <keyur@php.net> Mon, 28 Jul 2014 > 23:15:23 +0000 > Parents: 3e167ba990afc1f46739dfed9d4ba42e9389b2f2 > Branches: PHP-5.4 PHP-5.5 PHP-5.6 master > > Link: > ¿‡Í¹Å=ÌÈŒ > /zL6http://git.php.net/?p=php-src.git;a=commitdiff;h=00546bc9b7cb8208c27de9c6ebd12156401a5607 > > Log: > Fix bug #60616 (odbc_fetch_into returns junk at end of multi-byte char > fields) > > The ODBC extension did not support WVARCHAR. WVARCHAR ends up being > handled by > the default handler where vallen is set by the driver to the actual bytes > needed for the field. If it is larger than default-lrl then the output is > corrupted (reading past the buffer) because the return functions don't > expect > that to happen. The patch add support to handle WVARCHAR just like a > regular > VARCHAR. > > Bugs: > https://bugs.php.net/60616 > > Changed paths: > M ext/odbc/php_odbc.c > M ext/odbc/php_odbc_includes.h > > > Diff: > diff --git a/ext/odbc/php_odbc.c b/ext/odbc/php_odbc.c > index 4d21b3a..a6544d3 100644 > --- a/ext/odbc/php_odbc.c > +++ b/ext/odbc/php_odbc.c > @@ -780,6 +780,8 @@ PHP_MINIT_FUNCTION(odbc) > REGISTER_LONG_CONSTANT("SQL_TYPE_DATE", SQL_TYPE_DATE, > CONST_PERSISTENT | CONST_CS); > REGISTER_LONG_CONSTANT("SQL_TYPE_TIME", SQL_TYPE_TIME, > CONST_PERSISTENT | CONST_CS); > REGISTER_LONG_CONSTANT("SQL_TYPE_TIMESTAMP", SQL_TYPE_TIMESTAMP, > CONST_PERSISTENT | CONST_CS); > + REGISTER_LONG_CONSTANT("SQL_TYPE_WVARCHAR", SQL_TYPE_WVARCHAR, > CONST_PERSISTENT | CONST_CS); > + REGISTER_LONG_CONSTANT("SQL_TYPE_WLONGVARCHAR", > SQL_TYPE_WLONGVARCHAR, CONST_PERSISTENT | CONST_CS); > > /* > * SQLSpecialColumns values > @@ -966,6 +968,8 @@ int odbc_bindcols(odbc_result *result TSRMLS_DC) > case SQL_VARBINARY: > case SQL_LONGVARBINARY: > case SQL_LONGVARCHAR: > + case SQL_WVARCHAR: > + case SQL_WLONGVARCHAR: > result->values[i].value = NULL; > break; > > @@ -1724,6 +1728,8 @@ static void > php_odbc_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, int result_type) > if (result->binmode == 1) { > sql_c_type = SQL_C_BINARY; > } > + case SQL_WVARCHAR: > + case SQL_WLONGVARCHAR: > case SQL_LONGVARCHAR: > if (IS_SQL_LONG(result->values[i].coltype) > && result->longreadlen <= 0) { > Z_STRVAL_P(tmp) = > STR_EMPTY_ALLOC(); > @@ -1876,6 +1882,8 @@ PHP_FUNCTION(odbc_fetch_into) > break; > } > if (result->binmode == 1) sql_c_type = > SQL_C_BINARY; > + case SQL_WVARCHAR: > + case SQL_WLONGVARCHAR: > case SQL_LONGVARCHAR: > if (IS_SQL_LONG(result->values[i].coltype) > && result->longreadlen <= 0) { > Z_STRVAL_P(tmp) = > STR_EMPTY_ALLOC(); > @@ -2095,6 +2103,8 @@ PHP_FUNCTION(odbc_result) > break; > } > case SQL_LONGVARCHAR: > + case SQL_WVARCHAR: > + case SQL_WLONGVARCHAR: > if > (IS_SQL_LONG(result->values[field_ind].coltype)) { > if (result->longreadlen <= 0) { > break; > @@ -2132,7 +2142,9 @@ PHP_FUNCTION(odbc_result) > } > /* Reduce fieldlen by 1 if we have char data. One > day we might > have binary strings... */ > - if (result->values[field_ind].coltype == > SQL_LONGVARCHAR) { > + if ((result->values[field_ind].coltype == > SQL_LONGVARCHAR) || > + (result->values[field_ind].coltype == > SQL_WVARCHAR) || > + (result->values[field_ind].coltype == > SQL_WLONGVARCHAR)) { > fieldsize -= 1; > } > /* Don't duplicate result, saves one emalloc. > @@ -2247,6 +2259,8 @@ PHP_FUNCTION(odbc_result_all) > break; > } > if (result->binmode <= 1) > sql_c_type = SQL_C_BINARY; > + case SQL_WVARCHAR: > + case SQL_WLONGVARCHAR: > case SQL_LONGVARCHAR: > if > (IS_SQL_LONG(result->values[i].coltype) && > result->longreadlen <= 0) { > diff --git a/ext/odbc/php_odbc_includes.h b/ext/odbc/php_odbc_includes.h > index a9b0acf..b3ae889 100644 > --- a/ext/odbc/php_odbc_includes.h > +++ b/ext/odbc/php_odbc_includes.h > @@ -284,7 +284,7 @@ int odbc_bindcols(odbc_result *result TSRMLS_DC); > > void odbc_sql_error(ODBC_SQL_ERROR_PARAMS); > > -#define IS_SQL_LONG(x) (x == SQL_LONGVARBINARY || x == SQL_LONGVARCHAR) > +#define IS_SQL_LONG(x) (x == SQL_LONGVARBINARY || x == SQL_LONGVARCHAR || > x == SQL_WVARCHAR || x == SQL_WLONGVARCHAR) > #define IS_SQL_BINARY(x) (x == SQL_BINARY || x == SQL_VARBINARY || x == > SQL_LONGVARBINARY) > > #ifdef ZTS > > > -- > PHP CVS Mailing List (http://www.php.net/) > To unsubscribe, visit: http://www.php.net/unsub.php > > hi, you forgot to mention this change in the NEWS file. -- Ferenc Kovács @Tyr43l - http://tyrael.hu

« previous php.cvs (#79660) next »