abies Wed Jun 30 06:55:03 2004 EDT Modified files: /php-src/ext/interbase interbase.c Log: Fixed Ilia's alloca() issue/exploit Removed pointless RINIT() Use macros for consistent resource type names http://cvs.php.net/diff.php/php-src/ext/interbase/interbase.c?r1=1.221&r2=1.222&ty=u Index: php-src/ext/interbase/interbase.c diff -u php-src/ext/interbase/interbase.c:1.221 php-src/ext/interbase/interbase.c:1.222 --- php-src/ext/interbase/interbase.c:1.221 Tue Jun 1 04:38:33 2004 +++ php-src/ext/interbase/interbase.c Wed Jun 30 06:55:03 2004 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: interbase.c,v 1.221 2004/06/01 08:38:33 abies Exp $ */ +/* $Id: interbase.c,v 1.222 2004/06/30 10:55:03 abies Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -174,7 +174,7 @@ ibase_functions, PHP_MINIT(ibase), PHP_MSHUTDOWN(ibase), - PHP_RINIT(ibase), + NULL, PHP_RSHUTDOWN(ibase), PHP_MINFO(ibase), NO_VERSION_YET, @@ -284,7 +284,7 @@ /* Transaction resource: make sure it refers to one link only, then fetch it; database link is stored in ib_trans->db_link[]. */ IBDEBUG("Type is le_trans"); - ZEND_FETCH_RESOURCE(*trans, ibase_trans *, link_id, -1, "InterBase transaction", le_trans); + ZEND_FETCH_RESOURCE(*trans, ibase_trans *, link_id, -1, LE_TRANS, le_trans); if ((*trans)->link_cnt > 1) { _php_ibase_module_error("Link id is ambiguous: transaction spans multiple connections." TSRMLS_CC); @@ -297,7 +297,7 @@ IBDEBUG("Type is le_[p]link or id not found"); /* Database link resource, use default transaction. */ *trans = NULL; - ZEND_FETCH_RESOURCE2(*ib_link, ibase_db_link *, link_id, -1, "InterBase link", le_link, le_plink); + ZEND_FETCH_RESOURCE2(*ib_link, ibase_db_link *, link_id, -1, LE_LINK, le_link, le_plink); } /* }}} */ @@ -450,8 +450,9 @@ static void php_ibase_init_globals(zend_ibase_globals *ibase_globals) { - ibase_globals->num_persistent = 0; - ibase_globals->sql_code = 0; + ibase_globals->num_persistent = ibase_globals->num_links = 0; + ibase_globals->sql_code = *ibase_globals->errmsg = 0; + ibase_globals->default_link = -1; } PHP_MINIT_FUNCTION(ibase) @@ -460,9 +461,9 @@ REGISTER_INI_ENTRIES(); - le_link = zend_register_list_destructors_ex(_php_ibase_close_link, NULL, "interbase link", module_number); - le_plink = zend_register_list_destructors_ex(php_ibase_commit_link_rsrc, _php_ibase_close_plink, "interbase link persistent", module_number); - le_trans = zend_register_list_destructors_ex(_php_ibase_free_trans, NULL, "interbase transaction", module_number); + le_link = zend_register_list_destructors_ex(_php_ibase_close_link, NULL, LE_LINK, module_number); + le_plink = zend_register_list_destructors_ex(php_ibase_commit_link_rsrc, _php_ibase_close_plink, LE_PLINK, module_number); + le_trans = zend_register_list_destructors_ex(_php_ibase_free_trans, NULL, LE_TRANS, module_number); REGISTER_LONG_CONSTANT("IBASE_DEFAULT", PHP_IBASE_DEFAULT, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IBASE_CREATE", PHP_IBASE_CREATE, CONST_PERSISTENT); @@ -490,16 +491,6 @@ return SUCCESS; } -PHP_RINIT_FUNCTION(ibase) -{ - IBG(default_link)= -1; - IBG(num_links) = IBG(num_persistent); - - RESET_ERRMSG; - - return SUCCESS; -} - PHP_MSHUTDOWN_FUNCTION(ibase) { #ifndef PHP_WIN32 @@ -527,6 +518,11 @@ PHP_RSHUTDOWN_FUNCTION(ibase) { + IBG(num_links) = IBG(num_persistent); + IBG(default_link)= -1; + + RESET_ERRMSG; + return SUCCESS; } @@ -794,8 +790,7 @@ break; } - ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, link_arg, link_id, "InterBase link", - le_link, le_plink); + ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, link_arg, link_id, LE_LINK, le_link, le_plink); zend_list_delete(link_id); RETURN_TRUE; } @@ -829,8 +824,8 @@ break; } - ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, link_arg, link_id, "InterBase link", - le_link, le_plink); + ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, link_arg, link_id, LE_LINK, le_link, le_plink); + if (isc_drop_database(IB_STATUS, &ib_link->handle)) { _php_ibase_error(TSRMLS_C); RETURN_FALSE; @@ -865,22 +860,22 @@ argn = ZEND_NUM_ARGS(); /* (1+argn) is an upper bound for the number of links this trans connects to */ - ib_link = (ibase_db_link **) do_alloca(sizeof(ibase_db_link *) * (1+argn)); + ib_link = (ibase_db_link **) safe_emalloc(sizeof(ibase_db_link *),1+argn,0); if (argn > 0) { long trans_argl = 0; char *tpb; ISC_TEB *teb; - zval ***args = (zval ***) do_alloca(sizeof(zval **) * argn); + zval ***args = (zval ***) safe_emalloc(sizeof(zval **),argn,0); if (zend_get_parameters_array_ex(argn, args) == FAILURE) { - free_alloca(args); - free_alloca(ib_link); + efree(args); + efree(ib_link); RETURN_FALSE; } - teb = (ISC_TEB *) do_alloca(sizeof(ISC_TEB) * argn); - tpb = (char *) do_alloca(TPB_MAX_SIZE * argn); + teb = (ISC_TEB *) safe_emalloc(sizeof(ISC_TEB),argn,0); + tpb = (char *) safe_emalloc(TPB_MAX_SIZE,argn,0); /* enumerate all the arguments: assume every non-resource argument specifies modifiers for the link ids that follow it */ @@ -889,7 +884,7 @@ if (Z_TYPE_PP(args[i]) == IS_RESOURCE) { ZEND_FETCH_RESOURCE2(ib_link[link_cnt], ibase_db_link *, args[i], -1, - "InterBase link", le_link, le_plink); + LE_LINK, le_link, le_plink); /* copy the most recent modifier string into tbp[] */ memcpy(&tpb[TPB_MAX_SIZE * link_cnt], last_tpb, TPB_MAX_SIZE); @@ -946,14 +941,14 @@ result = isc_start_multiple(IB_STATUS, &tr_handle, link_cnt, teb); } - free_alloca(args); - free_alloca(tpb); - free_alloca(teb); + efree(args); + efree(tpb); + efree(teb); } if (link_cnt == 0) { link_cnt = 1; - ZEND_FETCH_RESOURCE2(ib_link[0], ibase_db_link *, NULL, IBG(default_link), "InterBase link", + ZEND_FETCH_RESOURCE2(ib_link[0], ibase_db_link *, NULL, IBG(default_link), LE_LINK, le_link, le_plink); result = isc_start_transaction(IB_STATUS, &tr_handle, 1, &ib_link[0]->handle, tpb_len, last_tpb); } @@ -961,7 +956,7 @@ /* start the transaction */ if (result) { _php_ibase_error(TSRMLS_C); - free_alloca(ib_link); + efree(ib_link); RETURN_FALSE; } @@ -987,7 +982,7 @@ (*l)->trans = ib_trans; (*l)->next = NULL; } - free_alloca(ib_link); + efree(ib_link); ZEND_REGISTER_RESOURCE(return_value, ib_trans, le_trans); } /* }}} */ @@ -1044,7 +1039,7 @@ int type; case 0: - ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, NULL, IBG(default_link), "InterBase link", + ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, NULL, 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 */ @@ -1060,14 +1055,12 @@ } /* one id was passed, could be db or trans id */ if (zend_list_find(Z_LVAL_PP(arg), &type) && type == le_trans) { - ZEND_FETCH_RESOURCE(trans, ibase_trans *, arg, -1, "InterBase transaction", - le_trans); + ZEND_FETCH_RESOURCE(trans, ibase_trans *, arg, -1, LE_TRANS, le_trans); convert_to_long_ex(arg); res_id = Z_LVAL_PP(arg); } else { - ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, arg, -1, "InterBase link", - le_link, le_plink); + ZEND_FETCH_RESOURCE2(ib_link, ibase_db_link *, arg, -1, 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 CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php