tony2001 Wed Jan 31 10:36:20 2007 UTC Modified files: /php-src/ext/oci8 oci8_statement.c php_oci8_int.h /php-src/ext/oci8/tests oci_execute_segfault.phpt Log: fix segfault on re-binding and re-executing a statement improve the test patch by Chris Jones http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/oci8_statement.c?r1=1.41&r2=1.42&diff_format=u Index: php-src/ext/oci8/oci8_statement.c diff -u php-src/ext/oci8/oci8_statement.c:1.41 php-src/ext/oci8/oci8_statement.c:1.42 --- php-src/ext/oci8/oci8_statement.c:1.41 Thu Jan 11 11:58:34 2007 +++ php-src/ext/oci8/oci8_statement.c Wed Jan 31 10:36:20 2007 @@ -25,7 +25,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: oci8_statement.c,v 1.41 2007/01/11 11:58:34 tony2001 Exp $ */ +/* $Id: oci8_statement.c,v 1.42 2007/01/31 10:36:20 tony2001 Exp $ */ #ifdef HAVE_CONFIG_H @@ -1147,7 +1147,17 @@ phpbind->out = 1; /* mark as OUT bind */ - if ((Z_TYPE_P(val) == IS_OBJECT) || (Z_TYPE_P(val) == IS_RESOURCE)) { + if (Z_TYPE_P(val) == IS_RESOURCE) { + retval = OCI_CONTINUE; + } else if (Z_TYPE_P(val) == IS_OBJECT) { + if (!phpbind->descriptor) { + return OCI_ERROR; + } + *alenpp = &phpbind->dummy_len; + *bufpp = phpbind->descriptor; + *piecep = OCI_ONE_PIECE; + *rcodepp = &phpbind->retcode; + *indpp = &phpbind->indicator; retval = OCI_CONTINUE; } else { if (UG(unicode)) { http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/php_oci8_int.h?r1=1.29&r2=1.30&diff_format=u Index: php-src/ext/oci8/php_oci8_int.h diff -u php-src/ext/oci8/php_oci8_int.h:1.29 php-src/ext/oci8/php_oci8_int.h:1.30 --- php-src/ext/oci8/php_oci8_int.h:1.29 Thu Jan 11 11:26:36 2007 +++ php-src/ext/oci8/php_oci8_int.h Wed Jan 31 10:36:20 2007 @@ -25,7 +25,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_oci8_int.h,v 1.29 2007/01/11 11:26:36 tony2001 Exp $ */ +/* $Id: php_oci8_int.h,v 1.30 2007/01/31 10:36:20 tony2001 Exp $ */ #if HAVE_OCI8 # ifndef PHP_OCI8_INT_H @@ -199,6 +199,7 @@ sb2 indicator; /* -1 means NULL */ ub2 retcode; /* */ zend_bool out; /* OUT bind or not */ + ub4 dummy_len; /* a dummy var to store alenpp value in bind OUT callback */ } php_oci_bind; /* }}} */ typedef struct { /* php_oci_out_column {{{ */ http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/tests/oci_execute_segfault.phpt?r1=1.3&r2=1.4&diff_format=u Index: php-src/ext/oci8/tests/oci_execute_segfault.phpt diff -u php-src/ext/oci8/tests/oci_execute_segfault.phpt:1.3 php-src/ext/oci8/tests/oci_execute_segfault.phpt:1.4 --- php-src/ext/oci8/tests/oci_execute_segfault.phpt:1.3 Tue Dec 6 19:26:57 2005 +++ php-src/ext/oci8/tests/oci_execute_segfault.phpt Wed Jan 31 10:36:20 2007 @@ -1,30 +1,54 @@ --TEST-- -oci_execute() segfault after repeated bind +oci_execute() segfault after repeated bind of LOB descriptor --SKIPIF-- <?php if (!extension_loaded('oci8')) die("skip no oci8 extension"); ?> --FILE-- <?php - + require dirname(__FILE__).'/connect.inc'; require dirname(__FILE__).'/create_table.inc'; $ora_sql = "INSERT INTO - ".$table_name." (blob, clob) + ".$schema.$table_name." (blob, clob) VALUES (empty_blob(), empty_clob()) RETURNING - blob - INTO :v_blob "; + clob + INTO :v_clob "; + +$s = oci_parse($c, $ora_sql); +$clob = oci_new_descriptor($c, OCI_D_LOB); +oci_bind_by_name($s, ":v_clob", $clob, -1, OCI_B_CLOB); +oci_execute($s, OCI_DEFAULT); +var_dump($clob->save("some text data")); + +oci_bind_by_name($s, ":v_clob", $clob, -1, OCI_B_CLOB); +oci_execute($s, OCI_DEFAULT); +var_dump($clob->save("some more text data")); -$s = oci_parse($c,$ora_sql); -$blob = oci_new_descriptor($c,OCI_D_LOB); -oci_bind_by_name($s,":v_blob", $blob,-1,OCI_B_BLOB); -oci_execute($s); +$query = 'SELECT clob, DBMS_LOB.GETLENGTH(clob) FROM '.$schema.$table_name.' ORDER BY 2'; -oci_bind_by_name($s,":v_blob", $blob,-1,OCI_B_BLOB); -oci_execute($s); +$s = oci_parse ($c, $query); +oci_execute($s, OCI_DEFAULT); + +while ($arr = oci_fetch_assoc($s)) { + $result = $arr['CLOB']->load(); + var_dump($result); +} + +require dirname(__FILE__).'/drop_table.inc'; echo "Done\n"; ?> --EXPECT-- +bool(true) +bool(true) +string(14) "some text data" +string(19) "some more text data" +Done +--UEXPECT-- +bool(true) +bool(true) +unicode(14) "some text data" +unicode(19) "some more text data" Done
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php