Re: com php-src: Fix #69975: PHP segfaults when accessing nvarchar(max) defined columns: ext/odbc/php_odbc.c ext/odbc/tests/bug69975.phpt
| From: | Christoph Becker | Date: | Fri, 03 Jul 2015 11:16:48 +0000 |
| Subject: | Re: com php-src: Fix #69975: PHP segfaults when accessing nvarchar(max) defined columns: ext/odbc/php_odbc.c ext/odbc/tests/bug69975.phpt | ||
| References: | 1 2 | Groups: | php.cvs php.internals |
| Request: | Send a blank email to internals+get-87009@lists.php.net to get a copy of this message | ||
Hi Anatol,
Anatol Belski wrote:
> Hi Christoph,
>
> Shouldn't it be only active for ODBCVER >= 0x0300 (see also the other code around
> this)?
Yes, of course. Thanks. I'll fix it ASAP.
Regards,
Christoph
> Regards
>
> Anatol
>
>> -----Original Message-----
>> From: Christoph Michael Becker [mailto:cmb@php.net]
>> Sent: Friday, July 3, 2015 12:16 AM
>> To: php-cvs@lists.php.net
>> Subject: [PHP-CVS] com php-src: Fix #69975: PHP segfaults when accessing
>> nvarchar(max) defined columns: ext/odbc/php_odbc.c
>> ext/odbc/tests/bug69975.phpt
>>
>> Commit: 16db4d1462bf3eacb93c0cd940f799160a284b24
>> Author: Christoph M. Becker <cmb@php.net> Fri, 3 Jul 2015 00:04:50
>> +0200
>> Parents: 57525d01dc29804903f03e471cf117e077d86ca4
>> Branches: PHP-5.6 master
>>
>> Link: http://git.php.net/?p=php-
>> src.git;a=commitdiff;h=16db4d1462bf3eacb93c0cd940f799160a284b24
>>
>> Log:
>> Fix #69975: PHP segfaults when accessing nvarchar(max) defined columns
>>
>> The SQL Server Native Client 11.0 and maybe other ODBC drivers report
>> NVARCHAR(MAX) columns as SQL_WVARCHAR with size 0. This causes too small
>> a buffer to be emalloc'd, likely causing a segfault in the following. As we don't
>> know the real size of the column data, we treat such colums as
>> SQL_WLONGVARCHAR.
>>
>> The related bug #67437 suggests that some drivers report a size of ~4GB. It is
>> not certain that this is really the case (there might be some integer overflow
>> involved, and anyway, there has been no feedback), so we do not cater for this
>> now. However, it would not be hard to treat all sizes above a certain threshold
>> in a similar way, i.e. as SQL_WLONGVARCHAR.
>>
>> Bugs:
>> https://bugs.php.net/69975
>> https://bugs.php.net/67437
>>
>> Changed paths:
>> M ext/odbc/php_odbc.c
>> A ext/odbc/tests/bug69975.phpt
>>
>>
>> Diff:
>> diff --git a/ext/odbc/php_odbc.c b/ext/odbc/php_odbc.c index
>> ddfbc4e..80af492 100644
>> --- a/ext/odbc/php_odbc.c
>> +++ b/ext/odbc/php_odbc.c
>> @@ -1008,6 +1008,13 @@ int odbc_bindcols(odbc_result *result TSRMLS_DC)
>> NULL, 0,
>> NULL, &displaysize);
>> }
>> #endif
>> + /* Workaround for drivers that report
>> NVARCHAR(MAX) columns as SQL_WVARCHAR with size 0 (bug #69975) */
>> + if (result->values[i].coltype == SQL_WVARCHAR
>> && displaysize == 0) {
>> + result->values[i].coltype =
>> SQL_WLONGVARCHAR;
>> + result->values[i].value = NULL;
>> + break;
>> + }
>> +
>> /* Workaround for Oracle ODBC Driver bug
>> (#50162) when fetching TIMESTAMP column */
>> if (result->values[i].coltype ==
>> SQL_TIMESTAMP) {
>> displaysize += 3;
>> diff --git a/ext/odbc/tests/bug69975.phpt b/ext/odbc/tests/bug69975.phpt new
>> file mode 100644 index 0000000..eca7564
>> --- /dev/null
>> +++ b/ext/odbc/tests/bug69975.phpt
>> @@ -0,0 +1,32 @@
>> +--TEST--
>> +Bug #69975 (PHP segfaults when accessing nvarchar(max) defined columns)
>> +--SKIPIF--
>> +<?php include 'skipif.inc'; ?>
>> +--FILE--
>> +<?php
>> +include 'config.inc';
>> +
>> +$conn = odbc_connect($dsn, $user, $pass); @odbc_exec($conn, 'CREATE
>> +DATABASE odbcTEST'); odbc_exec($conn, 'CREATE TABLE FOO (ID INT,
>> +VARCHAR_COL NVARCHAR(MAX))'); odbc_exec($conn, "INSERT INTO FOO
>> VALUES
>> +(1, 'foo')");
>> +
>> +$result = odbc_exec($conn, "SELECT VARCHAR_COL FROM FOO");
>> +var_dump(odbc_fetch_array($result));
>> +
>> +echo "ready";
>> +?>
>> +--EXPECT--
>> +array(1) {
>> + ["VARCHAR_COL"]=>
>> + string(3) "foo"
>> +}
>> +ready
>> +--CLEAN--
>> +<?php
>> +include 'config.inc';
>> +
>> +$conn = odbc_connect($dsn, $user, $pass); odbc_exec($conn, 'DROP TABLE
>> +FOO'); odbc_exec($conn, 'DROP DATABASE odbcTEST'); ?>
>>
>>
>> --
>> PHP CVS Mailing List (http://www.php.net/)
>> To unsubscribe, visit: http://www.php.net/unsub.php
>
>