From 8bfa5193d55f1287aaa996abfbd1b40af564fdec Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Fri, 8 Jan 2016 11:19:32 +0800 Subject: [PATCH] Fix various bugs in interbase Also read: https://marc.info/?l=php-internals&m=145077389117375&w=2 --- ext/interbase/ibase_blobs.c | 16 ++-- ext/interbase/ibase_events.c | 41 +++++----- ext/interbase/ibase_query.c | 85 ++++++++++---------- ext/interbase/ibase_service.c | 2 +- ext/interbase/interbase.c | 99 +++++++++++------------- ext/interbase/php_ibase_includes.h | 20 ++--- ext/interbase/tests/bug46543.phpt | 8 +- ext/interbase/tests/ibase_close_001.phpt | 4 +- ext/interbase/tests/ibase_trans_001.phpt | 4 +- 9 files changed, 136 insertions(+), 143 deletions(-) diff --git a/ext/interbase/ibase_blobs.c b/ext/interbase/ibase_blobs.c index 630b7330e9..917210a219 100644 --- a/ext/interbase/ibase_blobs.c +++ b/ext/interbase/ibase_blobs.c @@ -36,7 +36,7 @@ static void _php_ibase_free_blob(zend_resource *rsrc) /* {{{ */ { ibase_blob *ib_blob = (ibase_blob *)rsrc->ptr; - if (ib_blob->bl_handle != NULL) { /* blob open*/ + if (ib_blob->bl_handle != 0) { /* blob open*/ if (isc_cancel_blob(IB_STATUS, &ib_blob->bl_handle)) { _php_ibase_module_error("You can lose data. Close any blob after reading from or " "writing to it. Use ibase_blob_close() before calling ibase_close()"); @@ -216,7 +216,7 @@ PHP_FUNCTION(ibase_blob_create) PHP_IBASE_LINK_TRANS(link, ib_link, trans); ib_blob = (ibase_blob *) emalloc(sizeof(ibase_blob)); - ib_blob->bl_handle = NULL; + ib_blob->bl_handle = 0; ib_blob->type = BLOB_INPUT; if (isc_create_blob(IB_STATUS, &ib_link->handle, &trans->handle, &ib_blob->bl_handle, &ib_blob->bl_qd)) { @@ -261,7 +261,7 @@ PHP_FUNCTION(ibase_blob_open) PHP_IBASE_LINK_TRANS(link, ib_link, trans); ib_blob = (ibase_blob *) emalloc(sizeof(ibase_blob)); - ib_blob->bl_handle = NULL; + ib_blob->bl_handle = 0; ib_blob->type = BLOB_OUTPUT; do { @@ -361,7 +361,7 @@ static void _php_ibase_blob_end(INTERNAL_FUNCTION_PARAMETERS, int bl_end) /* {{{ RETURN_FALSE; } } - ib_blob->bl_handle = NULL; + ib_blob->bl_handle = 0; RETVAL_NEW_STR(_php_ibase_quad_to_string(ib_blob->bl_qd)); } else { /* discard created blob */ @@ -369,7 +369,7 @@ static void _php_ibase_blob_end(INTERNAL_FUNCTION_PARAMETERS, int bl_end) /* {{{ _php_ibase_error(); RETURN_FALSE; } - ib_blob->bl_handle = NULL; + ib_blob->bl_handle = 0; RETVAL_TRUE; } zend_list_delete(Z_RES_P(blob_arg)); @@ -401,7 +401,7 @@ PHP_FUNCTION(ibase_blob_info) zval *link = NULL; ibase_db_link *ib_link; ibase_trans *trans = NULL; - ibase_blob ib_blob = { NULL, BLOB_INPUT }; + ibase_blob ib_blob = { 0, BLOB_INPUT }; IBASE_BLOBINFO bl_info; RESET_ERRMSG; @@ -477,7 +477,7 @@ PHP_FUNCTION(ibase_blob_echo) zval *link = NULL; ibase_db_link *ib_link; ibase_trans *trans = NULL; - ibase_blob ib_blob_id = { NULL, BLOB_OUTPUT }; + ibase_blob ib_blob_id = { 0, BLOB_OUTPUT }; char bl_data[IBASE_BLOB_SEG]; unsigned short seg_len; @@ -538,7 +538,7 @@ PHP_FUNCTION(ibase_blob_import) zval *link = NULL, *file; int size; unsigned short b; - ibase_blob ib_blob = { NULL, 0 }; + ibase_blob ib_blob = { 0, 0 }; ibase_db_link *ib_link; ibase_trans *trans = NULL; char bl_data[IBASE_BLOB_SEG]; diff --git a/ext/interbase/ibase_events.c b/ext/interbase/ibase_events.c index bac2450d81..27844fc73a 100644 --- a/ext/interbase/ibase_events.c +++ b/ext/interbase/ibase_events.c @@ -45,7 +45,8 @@ void _php_ibase_free_event(ibase_event *event) /* {{{ */ if (event->link != NULL) { ibase_event **node; - if (event->link->handle != NULL && + zend_list_delete(event->link_res); + if (event->link->handle != 0 && isc_cancel_events(IB_STATUS, &event->link->handle, &event->event_id)) { _php_ibase_error(); } @@ -62,7 +63,9 @@ void _php_ibase_free_event(ibase_event *event) /* {{{ */ _php_ibase_event_free(event->event_buffer,event->result_buffer); for (i = 0; i < event->event_count; ++i) { - efree(event->events[i]); + if (event->events[i]) { + efree(event->events[i]); + } } efree(event->events); } @@ -150,7 +153,7 @@ PHP_FUNCTION(ibase_wait_event) if (ZEND_NUM_ARGS() > 15) { WRONG_PARAM_COUNT; } - if ((ib_link = (ibase_db_link *)zend_fetch_resource2_ex(IBG(default_link), "InterBase link", le_link, le_plink)) == NULL) { + if ((ib_link = (ibase_db_link *)zend_fetch_resource2(IBG(default_link), "InterBase link", le_link, le_plink)) == NULL) { RETURN_FALSE; } } @@ -190,8 +193,6 @@ PHP_FUNCTION(ibase_wait_event) static isc_callback _php_ibase_callback(ibase_event *event, /* {{{ */ unsigned short buffer_size, char *result_buf) { - zval *res; - /* this function is called asynchronously by the Interbase client library. */ TSRMLS_FETCH_FROM_CTX(event->thread_ctx); @@ -211,15 +212,14 @@ static isc_callback _php_ibase_callback(ibase_event *event, /* {{{ */ /* copy the updated results into the result buffer */ memcpy(event->result_buffer, result_buf, buffer_size); - res = zend_hash_index_find(&EG(regular_list), event->link_res_id); - ZVAL_RES(&args[1], Z_RES_P(res)); + ZVAL_RES(&args[1], event->link_res); /* find out which event occurred */ isc_event_counts(occurred_event, buffer_size, event->event_buffer, event->result_buffer); for (i = 0; i < event->event_count; ++i) { if (occurred_event[i]) { ZVAL_STRING(&args[0], event->events[i]); - efree(event->events[i]); + //efree(event->events[i]); break; } } @@ -262,7 +262,8 @@ PHP_FUNCTION(ibase_set_event_handler) ibase_db_link *ib_link; ibase_event *event; unsigned short i = 1, buffer_size; - int link_res_id, num_args; + int num_args; + zend_resource *link_res; RESET_ERRMSG; @@ -291,8 +292,7 @@ PHP_FUNCTION(ibase_set_event_handler) RETURN_FALSE; } - convert_to_long_ex(&args[0]); - link_res_id = Z_LVAL(args[0]); + link_res = Z_RES(args[0]); } else { /* callback, event_1 [, ... event_15] @@ -304,10 +304,10 @@ PHP_FUNCTION(ibase_set_event_handler) cb_arg = &args[0]; - if ((ib_link = (ibase_db_link *)zend_fetch_resource2_ex(IBG(default_link), "InterBase link", le_link, le_plink)) == NULL) { + if ((ib_link = (ibase_db_link *)zend_fetch_resource2(IBG(default_link), "InterBase link", le_link, le_plink)) == NULL) { RETURN_FALSE; } - link_res_id = IBG(default_link); + link_res = IBG(default_link); } /* get the callback */ @@ -321,17 +321,22 @@ PHP_FUNCTION(ibase_set_event_handler) /* allocate the event resource */ event = (ibase_event *) safe_emalloc(sizeof(ibase_event), 1, 0); TSRMLS_SET_CTX(event->thread_ctx); - event->link_res_id = link_res_id; + event->link_res = link_res; + GC_REFCOUNT(link_res)++; event->link = ib_link; event->event_count = 0; event->state = NEW; - event->events = (char **) safe_emalloc(sizeof(char *),ZEND_NUM_ARGS()-i,0); + event->events = (char **) safe_emalloc(sizeof(char *), 15, 0); ZVAL_DUP(&event->callback, cb_arg); - for (; i < ZEND_NUM_ARGS(); ++i) { - convert_to_string_ex(&args[i]); - event->events[event->event_count++] = estrdup(Z_STRVAL(args[i])); + for (; i < 15; ++i) { + if (i < ZEND_NUM_ARGS()) { + convert_to_string_ex(&args[i]); + event->events[event->event_count++] = estrdup(Z_STRVAL(args[i])); + } else { + event->events[i] = NULL; + } } /* fills the required data structure with information about the events */ diff --git a/ext/interbase/ibase_query.c b/ext/interbase/ibase_query.c index eaf06ed86c..124a6cd266 100644 --- a/ext/interbase/ibase_query.c +++ b/ext/interbase/ibase_query.c @@ -59,7 +59,7 @@ typedef struct _ib_query { ibase_db_link *link; ibase_trans *trans; ibase_result *result; - int result_res_id; + zend_resource *result_res; isc_stmt_handle stmt; XSQLDA *in_sqlda, *out_sqlda; ibase_array *in_array, *out_array; @@ -67,7 +67,7 @@ typedef struct _ib_query { unsigned short dialect; char statement_type; char *query; - long trans_res_id; + zend_resource *trans_res; } ibase_query; typedef struct { @@ -313,7 +313,7 @@ static int _php_ibase_alloc_array(ibase_array **ib_arrayp, XSQLDA *sqlda, /* {{{ /* allocate and prepare query */ static int _php_ibase_alloc_query(ibase_query *ib_query, ibase_db_link *link, /* {{{ */ - ibase_trans *trans, char *query, unsigned short dialect, int trans_res_id) + ibase_trans *trans, char *query, unsigned short dialect, zend_resource *trans_res) { static char info_type[] = {isc_info_sql_stmt_type}; char result[8]; @@ -326,14 +326,14 @@ static int _php_ibase_alloc_query(ibase_query *ib_query, ibase_db_link *link, /* ib_query->link = link; ib_query->trans = trans; - ib_query->result_res_id = 0; + ib_query->result_res = NULL; ib_query->result = NULL; - ib_query->stmt = NULL; + ib_query->stmt = 0; ib_query->in_array = NULL; ib_query->out_array = NULL; ib_query->dialect = dialect; ib_query->query = estrdup(query); - ib_query->trans_res_id = trans_res_id; + ib_query->trans_res = trans_res; ib_query->out_sqlda = NULL; ib_query->in_sqlda = NULL; @@ -530,8 +530,12 @@ static int _php_ibase_bind_array(zval *val, char *buf, unsigned long buf_size, / struct tm t = { 0, 0, 0, 0, 0, 0 }; switch (array->el_type) { +#ifndef HAVE_STRFTIME unsigned short n; +#endif +#if (SIZEOF_LONG < 8) ISC_INT64 l; +#endif case SQL_SHORT: convert_to_long(val); @@ -737,7 +741,7 @@ static int _php_ibase_bind(XSQLDA *sqlda, zval *b_vars, BIND_BUF *buf, /* {{{ */ if (Z_STRLEN_P(b_var) != BLOB_ID_LEN || !_php_ibase_string_to_quad(Z_STRVAL_P(b_var), &buf[i].val.qval)) { - ibase_blob ib_blob = { NULL, BLOB_INPUT }; + ibase_blob ib_blob = { 0, BLOB_INPUT }; if (isc_create_blob(IB_STATUS, &ib_query->link->handle, &ib_query->trans->handle, &ib_blob.bl_handle, &ib_blob.bl_qd)) { @@ -883,7 +887,7 @@ static int _php_ibase_exec(INTERNAL_FUNCTION_PARAMETERS, ibase_result **ib_resul case isc_info_sql_stmt_start_trans: /* a SET TRANSACTION statement should be executed with a NULL trans handle */ - tr = NULL; + tr = 0; if (isc_dsql_execute_immediate(IB_STATUS, &ib_query->link->handle, &tr, 0, ib_query->query, ib_query->dialect, NULL)) { @@ -923,11 +927,11 @@ static int _php_ibase_exec(INTERNAL_FUNCTION_PARAMETERS, ibase_result **ib_resul goto _php_ibase_exec_error; } - if (ib_query->trans->handle == NULL && ib_query->trans_res_id != 0) { + 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 */ - zval *res = zend_hash_index_find(&EG(regular_list), ib_query->trans_res_id); - zend_list_delete(Z_RES_P(res)); + zend_list_delete(ib_query->trans_res); + ib_query->trans_res = NULL; } RETVAL_TRUE; @@ -1063,7 +1067,7 @@ PHP_FUNCTION(ibase_query) char *query; size_t query_len; int bind_i, bind_num; - long trans_res_id = 0; + zend_resource *trans_res = NULL; ibase_db_link *ib_link = NULL; ibase_trans *trans = NULL; ibase_query ib_query = { NULL, NULL, 0, 0 }; @@ -1083,7 +1087,7 @@ PHP_FUNCTION(ibase_query) ib_link = (ibase_db_link*)zend_fetch_resource2_ex(zlink, LE_LINK, le_link, le_plink); trans = (ibase_trans*)zend_fetch_resource_ex(ztrans, LE_TRANS, le_trans); - trans_res_id = Z_RES_P(ztrans)->handle; + trans_res = Z_RES_P(ztrans); bind_i = 3; break; } @@ -1093,7 +1097,7 @@ PHP_FUNCTION(ibase_query) _php_ibase_get_link_trans(INTERNAL_FUNCTION_PARAM_PASSTHRU, zlink, &ib_link, &trans); if (trans != NULL) { - trans_res_id = Z_RES_P(zlink)->handle; + trans_res = Z_RES_P(zlink); } bind_i = 2; break; @@ -1102,8 +1106,8 @@ PHP_FUNCTION(ibase_query) /* the statement is 'CREATE DATABASE ...' if the link argument is IBASE_CREATE */ if (SUCCESS == zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS(), "ls", &l, &query, &query_len) && l == PHP_IBASE_CREATE) { - isc_db_handle db = NULL; - isc_tr_handle trans = NULL; + isc_db_handle db = 0; + isc_tr_handle trans = 0; if (PG(sql_safe_mode)) { _php_ibase_module_error("CREATE DATABASE is not allowed in SQL safe mode" @@ -1133,8 +1137,8 @@ PHP_FUNCTION(ibase_query) RETVAL_RES(zend_register_resource(ib_link, le_link)); Z_TRY_ADDREF_P(return_value); - IBG(default_link) = Z_RES_P(return_value)->handle; - ++IBG(num_links); + Z_TRY_ADDREF_P(return_value); + IBG(default_link) = Z_RES_P(return_value); } return; } @@ -1142,8 +1146,7 @@ PHP_FUNCTION(ibase_query) case 0: if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() ? 1 : 0, "s", &query, &query_len)) { - ib_link = (ibase_db_link *)zend_fetch_resource2_ex(IBG(default_link), LE_LINK, - le_link, le_plink); + ib_link = (ibase_db_link *)zend_fetch_resource2(IBG(default_link), LE_LINK, le_link, le_plink); bind_i = 1; break; @@ -1153,8 +1156,7 @@ PHP_FUNCTION(ibase_query) /* open default transaction */ if (ib_link == NULL || FAILURE == _php_ibase_def_trans(ib_link, &trans) - || FAILURE == _php_ibase_alloc_query(&ib_query, ib_link, trans, query, ib_link->dialect, - trans_res_id)) { + || FAILURE == _php_ibase_alloc_query(&ib_query, ib_link, trans, query, ib_link->dialect, trans_res)) { return; } @@ -1184,7 +1186,7 @@ PHP_FUNCTION(ibase_query) /* EXECUTE PROCEDURE returns only one row => statement can be released immediately */ if (ib_query.statement_type != isc_info_sql_stmt_exec_procedure) { - ib_query.stmt = NULL; /* keep stmt when free query */ + ib_query.stmt = 0; /* keep stmt when free query */ } RETVAL_RES(zend_register_resource(result, le_result)); Z_TRY_ADDREF_P(return_value); @@ -1211,7 +1213,7 @@ PHP_FUNCTION(ibase_affected_rows) } if (!arg) { - ib_link = (ibase_db_link *)zend_fetch_resource2_ex(IBG(default_link), LE_LINK, le_link, le_plink); + ib_link = (ibase_db_link *)zend_fetch_resource2(IBG(default_link), LE_LINK, le_link, le_plink); if (ib_link->tr_list == NULL || ib_link->tr_list->trans == NULL) { RETURN_FALSE; } @@ -1549,7 +1551,7 @@ static void _php_ibase_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, int fetch_type) char bl_info[20]; unsigned short i; - blob_handle.bl_handle = NULL; + blob_handle.bl_handle = 0; blob_handle.bl_qd = *(ISC_QUAD *) var->sqldata; if (isc_open_blob(IB_STATUS, &ib_result->link->handle, &ib_result->trans->handle, @@ -1599,7 +1601,6 @@ static void _php_ibase_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, int fetch_type) } } else { /* blob id only */ - char *s; ISC_QUAD bl_qd = *(ISC_QUAD *) var->sqldata; ZVAL_NEW_STR(&result, _php_ibase_quad_to_string(bl_qd)); } @@ -1732,7 +1733,8 @@ PHP_FUNCTION(ibase_prepare) zval *link_arg, *trans_arg; ibase_db_link *ib_link; ibase_trans *trans = NULL; - size_t query_len, trans_res_id = 0; + size_t query_len; + zend_resource *trans_res = NULL; ibase_query *ib_query; char *query; @@ -1742,7 +1744,7 @@ PHP_FUNCTION(ibase_prepare) if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &query, &query_len) == FAILURE) { return; } - ib_link = (ibase_db_link *)zend_fetch_resource2_ex(IBG(default_link), LE_LINK, le_link, le_plink); + ib_link = (ibase_db_link *)zend_fetch_resource2(IBG(default_link), LE_LINK, le_link, le_plink); } else if (ZEND_NUM_ARGS() == 2) { if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs", &link_arg, &query, &query_len) == FAILURE) { return; @@ -1750,7 +1752,7 @@ PHP_FUNCTION(ibase_prepare) _php_ibase_get_link_trans(INTERNAL_FUNCTION_PARAM_PASSTHRU, link_arg, &ib_link, &trans); if (trans != NULL) { - trans_res_id = Z_RES_P(link_arg)->handle; + trans_res = Z_RES_P(link_arg); } } else { if (zend_parse_parameters(ZEND_NUM_ARGS(), "rrs", &link_arg, &trans_arg, &query, &query_len) == FAILURE) { @@ -1758,7 +1760,7 @@ PHP_FUNCTION(ibase_prepare) } ib_link = (ibase_db_link *)zend_fetch_resource2_ex(link_arg, LE_LINK, le_link, le_plink); trans = (ibase_trans *)zend_fetch_resource_ex(trans_arg, LE_TRANS, le_trans); - trans_res_id = Z_RES_P(trans_arg)->handle; + trans_res = Z_RES_P(trans_arg); } if (FAILURE == _php_ibase_def_trans(ib_link, &trans)) { @@ -1767,7 +1769,7 @@ PHP_FUNCTION(ibase_prepare) ib_query = (ibase_query *) emalloc(sizeof(ibase_query)); - if (FAILURE == _php_ibase_alloc_query(ib_query, ib_link, trans, query, ib_link->dialect, trans_res_id)) { + if (FAILURE == _php_ibase_alloc_query(ib_query, ib_link, trans, query, ib_link->dialect, trans_res)) { efree(ib_query); RETURN_FALSE; } @@ -1808,21 +1810,16 @@ PHP_FUNCTION(ibase_execute) } /* Have we used this cursor before and it's still open (exec proc has no cursor) ? */ - if (ib_query->result_res_id != 0 + if (ib_query->result_res != NULL && ib_query->statement_type != isc_info_sql_stmt_exec_procedure) { - zval *res; - IBDEBUG("Implicitly closing a cursor"); if (isc_dsql_free_statement(IB_STATUS, &ib_query->stmt, DSQL_close)) { _php_ibase_error(); break; } - /* invalidate previous results returned by this query (not necessary for exec proc) */ - res = zend_hash_index_find(&EG(regular_list), ib_query->result_res_id); - if (res) { - zend_list_delete(Z_RES_P(res)); - } + zend_list_delete(ib_query->result_res); + ib_query->result_res = NULL; } if (FAILURE == _php_ibase_exec(INTERNAL_FUNCTION_PARAM_PASSTHRU, &result, ib_query, @@ -1831,7 +1828,7 @@ PHP_FUNCTION(ibase_execute) } /* free the query if trans handle was released */ - if (ib_query->trans->handle == NULL) { + if (ib_query->trans->handle == 0) { zend_list_delete(Z_RES_P(query)); } @@ -1840,11 +1837,11 @@ PHP_FUNCTION(ibase_execute) result->type = EXECUTE_RESULT; if (ib_query->statement_type == isc_info_sql_stmt_exec_procedure) { - result->stmt = NULL; + result->stmt = 0; } ret = zend_list_insert(result, le_result); - ib_query->result_res_id = Z_RES_HANDLE_P(ret); + 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); @@ -1867,6 +1864,10 @@ PHP_FUNCTION(ibase_free_query) } ib_query = (ibase_query *)zend_fetch_resource_ex(query_arg, LE_QUERY, le_query); + if (!ib_query) { + RETURN_FALSE; + } + zend_list_close(Z_RES_P(query_arg)); RETURN_TRUE; } diff --git a/ext/interbase/ibase_service.c b/ext/interbase/ibase_service.c index c1b1268cd0..cd43724f00 100644 --- a/ext/interbase/ibase_service.c +++ b/ext/interbase/ibase_service.c @@ -210,7 +210,7 @@ PHP_FUNCTION(ibase_service_attach) size_t hlen, ulen, plen, spb_len; ibase_service *svm; char buf[128], *host, *user, *pass, *loc; - isc_svc_handle handle = NULL; + isc_svc_handle handle = 0; RESET_ERRMSG; diff --git a/ext/interbase/interbase.c b/ext/interbase/interbase.c index 1eece4c000..76c29daeb8 100644 --- a/ext/interbase/interbase.c +++ b/ext/interbase/interbase.c @@ -41,7 +41,7 @@ #define COMMIT 1 #define RETAIN 2 -#define CHECK_LINK(link) { if (link==-1) { php_error_docref(NULL, E_WARNING, "A link to the server could not be established"); RETURN_FALSE; } } +#define CHECK_LINK(link) { if (link==NULL) { php_error_docref(NULL, E_WARNING, "A link to the server could not be established"); RETURN_FALSE; } } ZEND_DECLARE_MODULE_GLOBALS(ibase) static PHP_GINIT_FUNCTION(ibase); @@ -580,9 +580,9 @@ static void _php_ibase_commit_link(ibase_db_link *link) /* {{{ */ for (l = link->tr_list; l != NULL; ++i) { ibase_tr_list *p = l; - if (p->trans != NULL) { + if (p->trans != 0) { if (i == 0) { - if (p->trans->handle != NULL) { + if (p->trans->handle != 0) { IBDEBUG("Committing default transaction..."); if (isc_commit_transaction(IB_STATUS, &p->trans->handle)) { _php_ibase_error(); @@ -590,7 +590,7 @@ static void _php_ibase_commit_link(ibase_db_link *link) /* {{{ */ } efree(p->trans); /* default transaction is not a registered resource: clean up */ } else { - if (p->trans->handle != NULL) { + if (p->trans->handle != 0) { /* non-default trans might have been rolled back by other call of this dtor */ IBDEBUG("Rolling back other transactions..."); if (isc_rollback_transaction(IB_STATUS, &p->trans->handle)) { @@ -632,7 +632,7 @@ static void _php_ibase_close_link(zend_resource *rsrc) /* {{{ */ ibase_db_link *link = (ibase_db_link *) rsrc->ptr; _php_ibase_commit_link(link); - if (link->handle != NULL) { + if (link->handle != 0) { IBDEBUG("Closing normal link..."); isc_detach_database(IB_STATUS, &link->handle); } @@ -647,7 +647,7 @@ static void _php_ibase_close_plink(zend_resource *rsrc) /* {{{ */ _php_ibase_commit_link(link); IBDEBUG("Closing permanent link..."); - if (link->handle != NULL) { + if (link->handle != 0) { isc_detach_database(IB_STATUS, &link->handle); } IBG(num_persistent)--; @@ -662,7 +662,7 @@ static void _php_ibase_free_trans(zend_resource *rsrc) /* {{{ */ unsigned short i; IBDEBUG("Cleaning up transaction resource..."); - if (trans->handle != NULL) { + if (trans->handle != 0) { IBDEBUG("Rolling back unhandled transaction..."); if (isc_rollback_transaction(IB_STATUS, &trans->handle)) { _php_ibase_error(); @@ -719,7 +719,7 @@ static PHP_GINIT_FUNCTION(ibase) { ibase_globals->num_persistent = ibase_globals->num_links = 0; ibase_globals->sql_code = *ibase_globals->errmsg = 0; - ibase_globals->default_link = -1; + ibase_globals->default_link = NULL; } PHP_MINIT_FUNCTION(ibase) @@ -774,7 +774,7 @@ PHP_MSHUTDOWN_FUNCTION(ibase) zend_module_entry *ibase_entry; if ((ibase_entry = zend_hash_str_find_ptr(&module_registry, ibase_module_entry.name, strlen(ibase_module_entry.name))) != NULL) { - ibase_entry->handle = NULL; + ibase_entry->handle = 0; } #endif UNREGISTER_INI_ENTRIES(); @@ -784,7 +784,7 @@ PHP_MSHUTDOWN_FUNCTION(ibase) PHP_RSHUTDOWN_FUNCTION(ibase) { IBG(num_links) = IBG(num_persistent); - IBG(default_link)= -1; + IBG(default_link)= NULL; RESET_ERRMSG; @@ -842,7 +842,7 @@ static char const dpb_args[] = { 0, isc_dpb_user_name, isc_dpb_password, isc_dpb_lc_ctype, isc_dpb_sql_role_name, 0 }; -int _php_ibase_attach_db(char **args, int *len, long *largs, isc_db_handle *db) +int _php_ibase_attach_db(char **args, int *len, long *largs, isc_db_handle *db) /* {{{ */ { short i, dpb_len, buf_len = 257-2; /* version byte at the front, and a null at the end */ char dpb_buffer[257] = { isc_dpb_version1, 0 }, *dpb; @@ -882,7 +882,7 @@ static void _php_ibase_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) /* long largs[] = { 0, 0, 0 }; PHP_MD5_CTX hash_context; zend_resource new_index_ptr, *le; - isc_db_handle db_handle = NULL; + isc_db_handle db_handle = 0; ibase_db_link *ib_link; RESET_ERRMSG; @@ -932,15 +932,12 @@ 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) > 0) { - zval *link = zend_hash_index_find(&EG(regular_list), IBG(default_link)); - if (link) { - zend_list_delete(Z_RES_P(link)); - } + if (IBG(default_link)) { + zend_list_close(IBG(default_link)); } xlink->gc.refcount++; xlink->gc.refcount++; - IBG(default_link) = xlink->handle; + IBG(default_link) = xlink; RETVAL_RES(xlink); } else { zend_hash_str_del(&EG(regular_list), hash, sizeof(hash)-1); @@ -1017,13 +1014,10 @@ static void _php_ibase_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) /* (void *) &new_index_ptr, sizeof(zend_resource)) == NULL) { RETURN_FALSE; } - if (IBG(default_link) > 0) { - zval *link = zend_hash_index_find(&EG(regular_list), IBG(default_link)); - if (link) { - zend_list_delete(Z_RES_P(link)); - } + if (IBG(default_link)) { + zend_list_delete(IBG(default_link)); } - IBG(default_link) = Z_RES_P(return_value)->handle; + IBG(default_link) = Z_RES_P(return_value); Z_TRY_ADDREF_P(return_value); Z_TRY_ADDREF_P(return_value); } @@ -1050,8 +1044,7 @@ PHP_FUNCTION(ibase_pconnect) PHP_FUNCTION(ibase_close) { zval *link_arg = NULL; - ibase_db_link *ib_link; - int link_id; + zend_resource *link_res; RESET_ERRMSG; @@ -1060,23 +1053,18 @@ PHP_FUNCTION(ibase_close) } if (ZEND_NUM_ARGS() == 0) { - link_id = IBG(default_link); - CHECK_LINK(link_id); - IBG(default_link) = -1; + link_res = IBG(default_link); + CHECK_LINK(link_res); + IBG(default_link) = NULL; } else { - link_id = Z_RES_P(link_arg)->handle; + link_res = Z_RES_P(link_arg); } - ib_link = (ibase_db_link *)zend_fetch_resource2_ex(link_arg, LE_LINK, le_link, le_plink); - if (!link_arg) { - link_arg = zend_hash_index_find(&EG(regular_list), link_id); - zend_list_delete(Z_RES_P(link_arg)); - } /* we have at least 3 additional references to this resource ??? */ - if (GC_REFCOUNT(Z_RES_P(link_arg)) < 4) { - zend_list_close(Z_RES_P(link_arg)); + if (GC_REFCOUNT(link_res) < 4) { + zend_list_close(link_res); } else { - zend_list_delete(Z_RES_P(link_arg)); + zend_list_delete(link_res); } RETURN_TRUE; } @@ -1089,7 +1077,7 @@ PHP_FUNCTION(ibase_drop_db) zval *link_arg = NULL; ibase_db_link *ib_link; ibase_tr_list *l; - int link_id; + zend_resource *link_res; RESET_ERRMSG; @@ -1098,14 +1086,18 @@ PHP_FUNCTION(ibase_drop_db) } if (ZEND_NUM_ARGS() == 0) { - link_id = IBG(default_link); - CHECK_LINK(link_id); - IBG(default_link) = -1; + link_res = IBG(default_link); + CHECK_LINK(link_res); + IBG(default_link) = NULL; } else { - link_id = Z_RES_P(link_arg)->handle; + link_res = Z_RES_P(link_arg); } - ib_link = (ibase_db_link *)zend_fetch_resource2_ex(link_arg, LE_LINK, le_link, le_plink); + ib_link = (ibase_db_link *)zend_fetch_resource2(link_res, LE_LINK, le_link, le_plink); + + if (!ib_link) { + RETURN_FALSE; + } if (isc_drop_database(IB_STATUS, &ib_link->handle)) { _php_ibase_error(); @@ -1114,14 +1106,11 @@ PHP_FUNCTION(ibase_drop_db) /* isc_drop_database() doesn't invalidate the transaction handles */ for (l = ib_link->tr_list; l != NULL; l = l->next) { - if (l->trans != NULL) l->trans->handle = NULL; + if (l->trans != NULL) l->trans->handle = 0; } - if (!link_arg) { - link_arg = zend_hash_index_find(&EG(regular_list), link_id); - zend_list_delete(Z_RES_P(link_arg)); - } - zend_list_delete(Z_RES_P(link_arg)); + zend_list_delete(link_res); + RETURN_TRUE; } /* }}} */ @@ -1138,7 +1127,7 @@ PHP_FUNCTION(ibase_trans) char last_tpb[TPB_MAX_SIZE]; ibase_db_link **ib_link = NULL; ibase_trans *ib_trans; - isc_tr_handle tr_handle = NULL; + isc_tr_handle tr_handle = 0; ISC_STATUS result; RESET_ERRMSG; @@ -1236,7 +1225,7 @@ PHP_FUNCTION(ibase_trans) if (link_cnt == 0) { link_cnt = 1; - if ((ib_link[0] = (ibase_db_link *)zend_fetch_resource2_ex(IBG(default_link), LE_LINK, le_link, le_plink)) == NULL) { + if ((ib_link[0] = (ibase_db_link *)zend_fetch_resource2(IBG(default_link), LE_LINK, le_link, le_plink)) == NULL) { efree(ib_link); RETURN_FALSE; } @@ -1297,13 +1286,13 @@ int _php_ibase_def_trans(ibase_db_link *ib_link, ibase_trans **trans) /* {{{ */ if (tr == NULL) { tr = (ibase_trans *) emalloc(sizeof(ibase_trans)); - tr->handle = NULL; + tr->handle = 0; tr->link_cnt = 1; tr->affected_rows = 0; tr->db_link[0] = ib_link; ib_link->tr_list->trans = tr; } - if (tr->handle == NULL) { + if (tr->handle == 0) { if (isc_start_transaction(IB_STATUS, &tr->handle, 1, &ib_link->handle, 0, NULL)) { _php_ibase_error(); return FAILURE; @@ -1330,7 +1319,7 @@ static void _php_ibase_trans_end(INTERNAL_FUNCTION_PARAMETERS, int commit) /* {{ } if (ZEND_NUM_ARGS() == 0) { - ib_link = (ibase_db_link *)zend_fetch_resource2_ex(IBG(default_link), LE_LINK, le_link, le_plink); + ib_link = (ibase_db_link *)zend_fetch_resource2(IBG(default_link), LE_LINK, le_link, le_plink); if (ib_link->tr_list == NULL || ib_link->tr_list->trans == NULL) { /* this link doesn't have a default transaction */ _php_ibase_module_error("Default link has no default transaction"); diff --git a/ext/interbase/php_ibase_includes.h b/ext/interbase/php_ibase_includes.h index b7fb0a340f..fbbf7e34ce 100644 --- a/ext/interbase/php_ibase_includes.h +++ b/ext/interbase/php_ibase_includes.h @@ -60,7 +60,7 @@ extern int le_link, le_plink, le_trans; ZEND_BEGIN_MODULE_GLOBALS(ibase) ISC_STATUS status[20]; - long default_link; + zend_resource *default_link; long num_links, num_persistent; char errmsg[MAX_ERRMSG]; long sql_code; @@ -95,7 +95,7 @@ typedef struct { typedef struct event { ibase_db_link *link; - long link_res_id; + zend_resource* link_res; ISC_LONG event_id; unsigned short event_count; char **events; @@ -155,13 +155,15 @@ void _php_ibase_module_error(char *, ...) /* determine if a resource is a link or transaction handle */ #define PHP_IBASE_LINK_TRANS(zv, lh, th) \ - do { if (!zv) { \ - lh = (ibase_db_link *)zend_fetch_resource2(IBG(default_link), \ - "InterBase link", le_link, le_plink); } \ - else \ - _php_ibase_get_link_trans(INTERNAL_FUNCTION_PARAM_PASSTHRU, zv, &lh, &th); \ - if (SUCCESS != _php_ibase_def_trans(lh, &th)) { RETURN_FALSE; } \ - } while (0) + do { \ + if (!zv) { \ + lh = (ibase_db_link *)zend_fetch_resource2( \ + IBG(default_link), "InterBase link", le_link, le_plink); \ + } else { \ + _php_ibase_get_link_trans(INTERNAL_FUNCTION_PARAM_PASSTHRU, zv, &lh, &th); \ + } \ + if (SUCCESS != _php_ibase_def_trans(lh, &th)) { RETURN_FALSE; } \ + } while (0) int _php_ibase_def_trans(ibase_db_link *ib_link, ibase_trans **trans); void _php_ibase_get_link_trans(INTERNAL_FUNCTION_PARAMETERS, zval *link_id, diff --git a/ext/interbase/tests/bug46543.phpt b/ext/interbase/tests/bug46543.phpt index 59e088c3d0..88f38a6bd1 100644 --- a/ext/interbase/tests/bug46543.phpt +++ b/ext/interbase/tests/bug46543.phpt @@ -19,10 +19,10 @@ ibase_trans(1, 2, $x, $x, 3); ?> --EXPECTF-- -Warning: ibase_trans(): no Firebird/InterBase link resource supplied in %s on line %d +Warning: ibase_trans(): supplied resource is not a valid Firebird/InterBase link resource in %sbug46543.php on line %d -Warning: ibase_trans(): no Firebird/InterBase link resource supplied in %s on line %d +Warning: ibase_trans(): supplied resource is not a valid Firebird/InterBase link resource in %sbug46543.php on line %d -Warning: ibase_trans(): no Firebird/InterBase link resource supplied in %s on line %d +Warning: ibase_trans(): supplied resource is not a valid Firebird/InterBase link resource in %sbug46543.php on line %d -Warning: ibase_trans(): supplied resource is not a valid Firebird/InterBase link resource in %s on line %d +Warning: ibase_trans(): supplied resource is not a valid Firebird/InterBase link resource in %sbug46543.php on line %d diff --git a/ext/interbase/tests/ibase_close_001.phpt b/ext/interbase/tests/ibase_close_001.phpt index f74d109109..cb91e8a75a 100644 --- a/ext/interbase/tests/ibase_close_001.phpt +++ b/ext/interbase/tests/ibase_close_001.phpt @@ -17,9 +17,7 @@ var_dump(ibase_close('foo')); --EXPECTF-- bool(true) bool(true) - -Warning: ibase_close(): supplied resource is not a valid Firebird/InterBase link resource in %s on line %d -bool(false) +bool(true) Warning: ibase_close() expects parameter 1 to be resource,%string given in %s on line %d NULL diff --git a/ext/interbase/tests/ibase_trans_001.phpt b/ext/interbase/tests/ibase_trans_001.phpt index d8b7c81a1b..cceb60e9a1 100644 --- a/ext/interbase/tests/ibase_trans_001.phpt +++ b/ext/interbase/tests/ibase_trans_001.phpt @@ -18,6 +18,4 @@ var_dump(ibase_close($x)); resource(%d) of type (Firebird/InterBase transaction) resource(%d) of type (Firebird/InterBase transaction) bool(true) - -Warning: ibase_close(): supplied resource is not a valid Firebird/InterBase link resource in %s on line %d -bool(false) +bool(true) -- 2.40.0