diff options
Diffstat (limited to 'sapi/phpdbg/phpdbg.c')
| -rw-r--r-- | sapi/phpdbg/phpdbg.c | 90 | 
1 files changed, 46 insertions, 44 deletions
diff --git a/sapi/phpdbg/phpdbg.c b/sapi/phpdbg/phpdbg.c index 03aaf54431..463749ea3a 100644 --- a/sapi/phpdbg/phpdbg.c +++ b/sapi/phpdbg/phpdbg.c @@ -2,7 +2,7 @@     +----------------------------------------------------------------------+     | PHP Version 7                                                        |     +----------------------------------------------------------------------+ -   | Copyright (c) 1997-2018 The PHP Group                                | +   | Copyright (c) The PHP Group                                          |     +----------------------------------------------------------------------+     | This source file is subject to version 3.01 of the PHP license,      |     | that is bundled with this package in the file LICENSE, and is        | @@ -218,18 +218,6 @@ static PHP_MINIT_FUNCTION(phpdbg) /* {{{ */  static PHP_MSHUTDOWN_FUNCTION(phpdbg) /* {{{ */  { -	zend_hash_destroy(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE]); -	zend_hash_destroy(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE_PENDING]); -	zend_hash_destroy(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM]); -	zend_hash_destroy(&PHPDBG_G(bp)[PHPDBG_BREAK_FUNCTION_OPLINE]); -	zend_hash_destroy(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD_OPLINE]); -	zend_hash_destroy(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE_OPLINE]); -	zend_hash_destroy(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE]); -	zend_hash_destroy(&PHPDBG_G(bp)[PHPDBG_BREAK_OPCODE]); -	zend_hash_destroy(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD]); -	zend_hash_destroy(&PHPDBG_G(bp)[PHPDBG_BREAK_COND]); -	zend_hash_destroy(&PHPDBG_G(bp)[PHPDBG_BREAK_MAP]); -	zend_hash_destroy(&PHPDBG_G(seek));  	zend_hash_destroy(&PHPDBG_G(registered));  	phpdbg_destroy_watchpoints(); @@ -249,7 +237,7 @@ static PHP_MSHUTDOWN_FUNCTION(phpdbg) /* {{{ */  	}  	if (PHPDBG_G(exec)) { -		efree(PHPDBG_G(exec)); +		free(PHPDBG_G(exec));  		PHPDBG_G(exec) = NULL;  	} @@ -258,12 +246,6 @@ static PHP_MSHUTDOWN_FUNCTION(phpdbg) /* {{{ */  		PHPDBG_G(oplog) = NULL;  	} -	if (PHPDBG_G(ops)) { -		destroy_op_array(PHPDBG_G(ops)); -		efree(PHPDBG_G(ops)); -		PHPDBG_G(ops) = NULL; -	} -  	if (PHPDBG_G(oplog_list)) {  		phpdbg_oplog_list *cur = PHPDBG_G(oplog_list);  		do { @@ -325,11 +307,11 @@ static PHP_FUNCTION(phpdbg_exec)  			if (sb.st_mode & (S_IFREG|S_IFLNK)) {  				if (PHPDBG_G(exec)) {  					ZVAL_STRINGL(return_value, PHPDBG_G(exec), PHPDBG_G(exec_len)); -					efree(PHPDBG_G(exec)); +					free(PHPDBG_G(exec));  					result = 0;  				} -				PHPDBG_G(exec) = estrndup(ZSTR_VAL(exec), ZSTR_LEN(exec)); +				PHPDBG_G(exec) = zend_strndup(ZSTR_VAL(exec), ZSTR_LEN(exec));  				PHPDBG_G(exec_len) = ZSTR_LEN(exec);  				if (result) { @@ -480,9 +462,9 @@ static PHP_FUNCTION(phpdbg_start_oplog)  static zend_always_inline zend_bool phpdbg_is_ignored_opcode(zend_uchar opcode) {  	return  	    opcode == ZEND_NOP || opcode == ZEND_OP_DATA || opcode == ZEND_FE_FREE || opcode == ZEND_FREE || opcode == ZEND_ASSERT_CHECK || opcode == ZEND_VERIFY_RETURN_TYPE -	 || opcode == ZEND_DECLARE_CONST || opcode == ZEND_DECLARE_CLASS || opcode == ZEND_DECLARE_INHERITED_CLASS || opcode == ZEND_DECLARE_FUNCTION -	 || opcode == ZEND_DECLARE_INHERITED_CLASS_DELAYED || opcode == ZEND_VERIFY_ABSTRACT_CLASS || opcode == ZEND_ADD_TRAIT || opcode == ZEND_BIND_TRAITS -	 || opcode == ZEND_DECLARE_ANON_CLASS || opcode == ZEND_DECLARE_ANON_INHERITED_CLASS || opcode == ZEND_FAST_RET || opcode == ZEND_TICKS +	 || opcode == ZEND_DECLARE_CONST || opcode == ZEND_DECLARE_CLASS || opcode == ZEND_DECLARE_FUNCTION +	 || opcode == ZEND_DECLARE_CLASS_DELAYED +	 || opcode == ZEND_DECLARE_ANON_CLASS || opcode == ZEND_FAST_RET || opcode == ZEND_TICKS  	 || opcode == ZEND_EXT_STMT || opcode == ZEND_EXT_FCALL_BEGIN || opcode == ZEND_EXT_FCALL_END || opcode == ZEND_EXT_NOP || opcode == ZEND_BIND_GLOBAL  	;  } @@ -671,11 +653,11 @@ static PHP_FUNCTION(phpdbg_end_oplog)  	{  		zend_string *last_file = NULL; -		HashTable *file_ht; +		HashTable *file_ht = NULL;  		zend_string *last_function = (void *)~(uintptr_t)0;  		zend_class_entry *last_scope = NULL; -		HashTable *insert_ht; +		HashTable *insert_ht = NULL;  		zend_long insert_idx;  		do { @@ -717,6 +699,7 @@ static PHP_FUNCTION(phpdbg_end_oplog)  				insert_idx = cur->op->lineno;  			} +			ZEND_ASSERT(insert_ht && file_ht);  			{  				zval *num = zend_hash_index_find(insert_ht, insert_idx);  				if (!num) { @@ -901,6 +884,27 @@ static int php_sapi_phpdbg_activate(void) /* {{{ */  static int php_sapi_phpdbg_deactivate(void) /* {{{ */  { +	/* Everything using ZMM should be freed here... */ +	zend_hash_destroy(&PHPDBG_G(file_sources)); +	zend_hash_destroy(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE]); +	zend_hash_destroy(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE_PENDING]); +	zend_hash_destroy(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM]); +	zend_hash_destroy(&PHPDBG_G(bp)[PHPDBG_BREAK_FUNCTION_OPLINE]); +	zend_hash_destroy(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD_OPLINE]); +	zend_hash_destroy(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE_OPLINE]); +	zend_hash_destroy(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE]); +	zend_hash_destroy(&PHPDBG_G(bp)[PHPDBG_BREAK_OPCODE]); +	zend_hash_destroy(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD]); +	zend_hash_destroy(&PHPDBG_G(bp)[PHPDBG_BREAK_COND]); +	zend_hash_destroy(&PHPDBG_G(bp)[PHPDBG_BREAK_MAP]); +	zend_hash_destroy(&PHPDBG_G(seek)); + +	if (PHPDBG_G(ops)) { +		destroy_op_array(PHPDBG_G(ops)); +		efree(PHPDBG_G(ops)); +		PHPDBG_G(ops) = NULL; +	} +  	return SUCCESS;  } @@ -1416,9 +1420,10 @@ int main(int argc, char **argv) /* {{{ */  phpdbg_main:  #ifdef ZTS -	tsrm_startup(1, 1, 0, NULL); -	(void)ts_resource(0); +	php_tsrm_startup(); +# ifdef PHP_WIN32  	ZEND_TSRMLS_CACHE_UPDATE(); +# endif  #endif  	zend_signal_startup(); @@ -1659,16 +1664,17 @@ phpdbg_main:  	phpdbg_set_color_ex(PHPDBG_COLOR_ERROR,   PHPDBG_STRL("red-bold"));  	phpdbg_set_color_ex(PHPDBG_COLOR_NOTICE,  PHPDBG_STRL("green")); -	/* set default prompt */ -	phpdbg_set_prompt(PHPDBG_DEFAULT_PROMPT); -  	if (settings > (zend_phpdbg_globals *) 0x2) {  #ifdef ZTS -		*((zend_phpdbg_globals *) (*((void ***) TSRMLS_CACHE))[TSRM_UNSHUFFLE_RSRC_ID(phpdbg_globals_id)]) = *settings; +		zend_phpdbg_globals *ptr = TSRMG_BULK_STATIC(phpdbg_globals_id, zend_phpdbg_globals *); +		*ptr = *settings;  #else  		phpdbg_globals = *settings;  #endif  		free(settings); +	} else { +		/* set default prompt */ +		phpdbg_set_prompt(PHPDBG_DEFAULT_PROMPT);  	}  	/* set flags from command line */ @@ -1690,7 +1696,7 @@ phpdbg_main:  				phpdbg_do_help_cmd(exec);  			} else if (show_version) {  				phpdbg_out( -					"phpdbg %s (built: %s %s)\nPHP %s, Copyright (c) 1997-2018 The PHP Group\n%s", +					"phpdbg %s (built: %s %s)\nPHP %s, Copyright (c) The PHP Group\n%s",  					PHPDBG_VERSION,  					__DATE__,  					__TIME__, @@ -2092,10 +2098,6 @@ phpdbg_out:  			zend_objects_store_mark_destructed(&EG(objects_store));  		} -		zend_try { -			php_request_shutdown(NULL); -		} zend_end_try(); -  		if (PHPDBG_G(exec) && strcmp("Standard input code", PHPDBG_G(exec)) == SUCCESS) { /* i.e. execution context has been read from stdin - back it up */  			phpdbg_file_source *data = zend_hash_str_find_ptr(&PHPDBG_G(file_sources), PHPDBG_G(exec), PHPDBG_G(exec_len));  			backup_phpdbg_compile = zend_string_alloc(data->len + 2, 1); @@ -2103,6 +2105,10 @@ phpdbg_out:  			sprintf(ZSTR_VAL(backup_phpdbg_compile), "?>%.*s", (int) data->len, data->buf);  		} +		zend_try { +			php_request_shutdown(NULL); +		} zend_end_try(); +  		/* backup globals when cleaning */  		if ((cleaning > 0 || remote) && !quit_immediately) {  			settings = calloc(1, sizeof(zend_phpdbg_globals)); @@ -2155,12 +2161,6 @@ phpdbg_out:  			Z_PTR_P(zv) = (void*)PHPDBG_G(orig_url_wrap_php);  		} -		zend_hash_destroy(&PHPDBG_G(file_sources)); - -		zend_try { -			php_module_shutdown(); -		} zend_end_try(); -  #ifndef _WIN32  		/* force override (no zend_signals) to prevent crashes due to signal recursion in SIGSEGV/SIGBUS handlers */  		signal(SIGSEGV, SIG_DFL); @@ -2171,6 +2171,8 @@ phpdbg_out:  #endif  	} +	php_module_shutdown(); +  	sapi_shutdown();  	if (sapi_name) {  | 
