-
-
Save nikic/ef81684007753232893eae7acc034196 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From 24ea7967345cc834859ec3926dd010eba6526d0c Mon Sep 17 00:00:00 2001 | |
From: Nikita Popov <nikita.ppv@gmail.com> | |
Date: Fri, 22 Mar 2019 16:09:40 +0100 | |
Subject: [PATCH] Try to fix interbase | |
--- | |
ext/interbase/ibase_query.c | 17 +++++++---------- | |
ext/interbase/interbase.c | 35 ++++++++++++++++++----------------- | |
2 files changed, 25 insertions(+), 27 deletions(-) | |
diff --git a/ext/interbase/ibase_query.c b/ext/interbase/ibase_query.c | |
index 8d23a7d793..7c65983f87 100644 | |
--- a/ext/interbase/ibase_query.c | |
+++ b/ext/interbase/ibase_query.c | |
@@ -914,7 +914,6 @@ static int _php_ibase_exec(INTERNAL_FUNCTION_PARAMETERS, ibase_result **ib_resul | |
(*l)->next = NULL; | |
RETVAL_RES(zend_register_resource(trans, le_trans)); | |
- Z_TRY_ADDREF_P(return_value); | |
return SUCCESS; | |
@@ -930,7 +929,7 @@ static int _php_ibase_exec(INTERNAL_FUNCTION_PARAMETERS, ibase_result **ib_resul | |
if (ib_query->trans->handle == 0 && ib_query->trans_res != NULL) { | |
/* transaction was released by the query and was a registered resource, | |
so we have to release it */ | |
- zend_list_delete(ib_query->trans_res); | |
+ zend_list_close(ib_query->trans_res); | |
ib_query->trans_res = NULL; | |
} | |
@@ -1133,7 +1132,9 @@ PHP_FUNCTION(ibase_query) | |
RETVAL_RES(zend_register_resource(ib_link, le_link)); | |
Z_TRY_ADDREF_P(return_value); | |
- Z_TRY_ADDREF_P(return_value); | |
+ if (IBG(default_link)) { | |
+ zend_list_delete(IBG(default_link)); | |
+ } | |
IBG(default_link) = Z_RES_P(return_value); | |
} | |
return; | |
@@ -1185,7 +1186,6 @@ PHP_FUNCTION(ibase_query) | |
ib_query.stmt = 0; /* keep stmt when free query */ | |
} | |
RETVAL_RES(zend_register_resource(result, le_result)); | |
- Z_TRY_ADDREF_P(return_value); | |
} | |
} while (0); | |
@@ -1717,7 +1717,7 @@ PHP_FUNCTION(ibase_free_result) | |
} | |
ib_result = (ibase_result *)zend_fetch_resource_ex(result_arg, LE_RESULT, le_result); | |
- zend_list_delete(Z_RES_P(result_arg)); | |
+ zend_list_close(Z_RES_P(result_arg)); | |
RETURN_TRUE; | |
} | |
/* }}} */ | |
@@ -1770,7 +1770,6 @@ PHP_FUNCTION(ibase_prepare) | |
RETURN_FALSE; | |
} | |
RETVAL_RES(zend_register_resource(ib_query, le_query)); | |
- Z_TRY_ADDREF_P(return_value); | |
} | |
/* }}} */ | |
@@ -1814,7 +1813,7 @@ PHP_FUNCTION(ibase_execute) | |
_php_ibase_error(); | |
break; | |
} | |
- zend_list_delete(ib_query->result_res); | |
+ zend_list_close(ib_query->result_res); | |
ib_query->result_res = NULL; | |
} | |
@@ -1825,7 +1824,7 @@ PHP_FUNCTION(ibase_execute) | |
/* free the query if trans handle was released */ | |
if (ib_query->trans->handle == 0) { | |
- zend_list_delete(Z_RES_P(query)); | |
+ zend_list_close(Z_RES_P(query)); | |
} | |
if (result != NULL) { | |
@@ -1839,8 +1838,6 @@ PHP_FUNCTION(ibase_execute) | |
ret = zend_list_insert(result, le_result); | |
ib_query->result_res = Z_RES_P(ret); | |
ZVAL_COPY_VALUE(return_value, ret); | |
- Z_TRY_ADDREF_P(return_value); | |
- Z_TRY_ADDREF_P(return_value); | |
} | |
} while (0); | |
} | |
diff --git a/ext/interbase/interbase.c b/ext/interbase/interbase.c | |
index 478133296b..9e315ef6d5 100644 | |
--- a/ext/interbase/interbase.c | |
+++ b/ext/interbase/interbase.c | |
@@ -790,7 +790,7 @@ PHP_MSHUTDOWN_FUNCTION(ibase) | |
PHP_RSHUTDOWN_FUNCTION(ibase) | |
{ | |
IBG(num_links) = IBG(num_persistent); | |
- IBG(default_link)= NULL; | |
+ IBG(default_link) = NULL; | |
RESET_ERRMSG; | |
@@ -939,13 +939,15 @@ static void _php_ibase_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) /* | |
xlink = (zend_resource*) le->ptr; | |
if ((!persistent && xlink->type == le_link) || xlink->type == le_plink) { | |
- if (IBG(default_link)) { | |
- zend_list_close(IBG(default_link)); | |
+ if (IBG(default_link) != xlink) { | |
+ GC_ADDREF(xlink); | |
+ if (IBG(default_link)) { | |
+ zend_list_delete(IBG(default_link)); | |
+ } | |
+ IBG(default_link) = xlink; | |
} | |
GC_ADDREF(xlink); | |
- GC_ADDREF(xlink); | |
- IBG(default_link) = xlink; | |
- RETVAL_RES(xlink); | |
+ RETURN_RES(xlink); | |
} else { | |
zend_hash_str_del(&EG(regular_list), hash, sizeof(hash)-1); | |
} | |
@@ -1014,12 +1016,11 @@ static void _php_ibase_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) /* | |
new_index_ptr.type = le_index_ptr; | |
zend_hash_str_update_mem(&EG(regular_list), hash, sizeof(hash)-1, | |
(void *) &new_index_ptr, sizeof(zend_resource)); | |
+ Z_TRY_ADDREF_P(return_value); | |
if (IBG(default_link)) { | |
zend_list_delete(IBG(default_link)); | |
} | |
IBG(default_link) = Z_RES_P(return_value); | |
- Z_TRY_ADDREF_P(return_value); | |
- Z_TRY_ADDREF_P(return_value); | |
} | |
/* }}} */ | |
@@ -1055,17 +1056,17 @@ PHP_FUNCTION(ibase_close) | |
if (ZEND_NUM_ARGS() == 0) { | |
link_res = IBG(default_link); | |
CHECK_LINK(link_res); | |
+ GC_DELREF(IBG(default_link)); | |
IBG(default_link) = NULL; | |
} else { | |
link_res = Z_RES_P(link_arg); | |
+ /* ??? Don't close if it's the same as the default link. */ | |
+ if (link_res == IBG(default_link)) { | |
+ RETURN_TRUE; | |
+ } | |
} | |
- /* we have at least 3 additional references to this resource ??? */ | |
- if (GC_REFCOUNT(link_res) < 4) { | |
- zend_list_close(link_res); | |
- } else { | |
- zend_list_delete(link_res); | |
- } | |
+ zend_list_close(link_res); | |
RETURN_TRUE; | |
} | |
/* }}} */ | |
@@ -1088,6 +1089,7 @@ PHP_FUNCTION(ibase_drop_db) | |
if (ZEND_NUM_ARGS() == 0) { | |
link_res = IBG(default_link); | |
CHECK_LINK(link_res); | |
+ GC_DELREF(IBG(default_link)); | |
IBG(default_link) = NULL; | |
} else { | |
link_res = Z_RES_P(link_arg); | |
@@ -1109,7 +1111,7 @@ PHP_FUNCTION(ibase_drop_db) | |
if (l->trans != NULL) l->trans->handle = 0; | |
} | |
- zend_list_delete(link_res); | |
+ zend_list_close(link_res); | |
RETURN_TRUE; | |
} | |
@@ -1261,7 +1263,6 @@ PHP_FUNCTION(ibase_trans) | |
} | |
efree(ib_link); | |
RETVAL_RES(zend_register_resource(ib_trans, le_trans)); | |
- Z_TRY_ADDREF_P(return_value); | |
} | |
/* }}} */ | |
@@ -1363,7 +1364,7 @@ static void _php_ibase_trans_end(INTERNAL_FUNCTION_PARAMETERS, int commit) /* {{ | |
/* Don't try to destroy implicitly opened transaction from list... */ | |
if ((commit & RETAIN) == 0 && res_id != 0) { | |
- zend_list_delete(Z_RES_P(arg)); | |
+ zend_list_close(Z_RES_P(arg)); | |
} | |
RETURN_TRUE; | |
} | |
-- | |
2.17.1 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment