summaryrefslogtreecommitdiff
path: root/ext/interbase
diff options
context:
space:
mode:
authorDaniela Mariaschi <daniela@php.net>2002-04-04 02:15:47 +0000
committerDaniela Mariaschi <daniela@php.net>2002-04-04 02:15:47 +0000
commitc02a5dcc1d33735c9d676b3cc057b9383bdd6168 (patch)
treeff580144ae9aa1a157340355656cea11ed741def /ext/interbase
parent7779d3de920f3851102413ea35ddf16a8491df95 (diff)
downloadphp-git-c02a5dcc1d33735c9d676b3cc057b9383bdd6168.tar.gz
Fixed sigfault in ibase_close(). Bug #15419 #15992
@- Fixed sigfault in ibase_close() if user doesn't free resultset @ (Bug #15419, #15992) (daniela)
Diffstat (limited to 'ext/interbase')
-rw-r--r--ext/interbase/interbase.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/ext/interbase/interbase.c b/ext/interbase/interbase.c
index aed0db0837..a5daf4e037 100644
--- a/ext/interbase/interbase.c
+++ b/ext/interbase/interbase.c
@@ -383,12 +383,17 @@ static void _php_ibase_close_plink(zend_rsrc_list_entry *rsrc TSRMLS_DC)
/* {{{ _php_ibase_free_result() */
static void _php_ibase_free_result(zend_rsrc_list_entry *rsrc TSRMLS_DC)
{
+ char tr_items[] = {isc_info_tra_id };
+ char tmp[32]; /* should be enough as on the Api doc */
+
ibase_result *ib_result = (ibase_result *)rsrc->ptr;
IBDEBUG("Freeing result...");
if (ib_result){
_php_ibase_free_xsqlda(ib_result->out_sqlda);
- if (ib_result->drop_stmt && ib_result->stmt) {
+ isc_transaction_info(IB_STATUS, &ib_result->trans,sizeof(tr_items), tr_items, sizeof(tmp), tmp );
+ /* we have a transaction still open and we really want to drop the statement ? */
+ if ( !(IB_STATUS[0] && IB_STATUS[1]) && ib_result->drop_stmt && ib_result->stmt ) {
IBDEBUG("Dropping statement handle (free_result)...");
if (isc_dsql_free_statement(IB_STATUS, &ib_result->stmt, DSQL_drop)) {
_php_ibase_error();
@@ -416,6 +421,8 @@ static void _php_ibase_free_result(zend_rsrc_list_entry *rsrc TSRMLS_DC)
/* {{{ _php_ibase_free_query() */
static void _php_ibase_free_query(ibase_query *ib_query)
{
+ char tr_items[] = {isc_info_tra_id };
+ char tmp[32] ; /* ...should be enough as on the Api doc */
TSRMLS_FETCH();
IBDEBUG("Freeing query...");
@@ -426,7 +433,9 @@ static void _php_ibase_free_query(ibase_query *ib_query)
if (ib_query->out_sqlda) {
efree(ib_query->out_sqlda);
}
- if (ib_query->stmt) {
+ isc_transaction_info(IB_STATUS, &ib_query->trans,sizeof(tr_items), tr_items, sizeof(tmp), tmp );
+ /* we have the trans still open and a statement to drop? */
+ if ( !(IB_STATUS[0] && IB_STATUS[0]) && ib_query->stmt) {
IBDEBUG("Dropping statement handle (free_query)...");
if (isc_dsql_free_statement(IB_STATUS, &ib_query->stmt, DSQL_drop)){
_php_ibase_error();