Skip to content

Instantly share code, notes, and snippets.

@nikic
Created March 22, 2019 16:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nikic/ef81684007753232893eae7acc034196 to your computer and use it in GitHub Desktop.
Save nikic/ef81684007753232893eae7acc034196 to your computer and use it in GitHub Desktop.
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