1999-04-08 02:10:10 +08:00
|
|
|
/*
|
|
|
|
+----------------------------------------------------------------------+
|
|
|
|
| Zend Engine |
|
|
|
|
+----------------------------------------------------------------------+
|
2019-01-30 17:23:29 +08:00
|
|
|
| Copyright (c) Zend Technologies Ltd. (http://www.zend.com) |
|
1999-04-08 02:10:10 +08:00
|
|
|
+----------------------------------------------------------------------+
|
2001-12-11 23:16:21 +08:00
|
|
|
| This source file is subject to version 2.00 of the Zend license, |
|
1999-07-16 22:58:16 +08:00
|
|
|
| that is bundled with this package in the file LICENSE, and is |
|
2003-06-11 04:04:29 +08:00
|
|
|
| available through the world-wide-web at the following url: |
|
2001-12-11 23:16:21 +08:00
|
|
|
| http://www.zend.com/license/2_00.txt. |
|
1999-07-16 22:58:16 +08:00
|
|
|
| If you did not receive a copy of the Zend license and are unable to |
|
|
|
|
| obtain it through the world-wide-web, please send a note to |
|
|
|
|
| license@zend.com so we can mail you a copy immediately. |
|
1999-04-08 02:10:10 +08:00
|
|
|
+----------------------------------------------------------------------+
|
2018-11-01 23:20:07 +08:00
|
|
|
| Authors: Andi Gutmans <andi@php.net> |
|
|
|
|
| Zeev Suraski <zeev@php.net> |
|
1999-04-08 02:10:10 +08:00
|
|
|
+----------------------------------------------------------------------+
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "zend.h"
|
|
|
|
#include "zend_extensions.h"
|
2001-02-27 02:18:34 +08:00
|
|
|
#include "zend_modules.h"
|
1999-04-08 02:10:10 +08:00
|
|
|
#include "zend_constants.h"
|
|
|
|
#include "zend_list.h"
|
1999-06-11 18:44:26 +08:00
|
|
|
#include "zend_API.h"
|
2004-02-12 18:38:14 +08:00
|
|
|
#include "zend_exceptions.h"
|
1999-09-20 20:24:39 +08:00
|
|
|
#include "zend_builtin_functions.h"
|
2000-12-27 23:43:15 +08:00
|
|
|
#include "zend_ini.h"
|
2008-04-17 18:21:38 +08:00
|
|
|
#include "zend_vm.h"
|
2010-04-24 21:32:30 +08:00
|
|
|
#include "zend_dtrace.h"
|
2013-10-17 16:40:43 +08:00
|
|
|
#include "zend_virtual_cwd.h"
|
2015-10-07 17:35:43 +08:00
|
|
|
#include "zend_smart_str.h"
|
2016-12-19 00:53:27 +08:00
|
|
|
#include "zend_smart_string.h"
|
2018-01-16 18:27:18 +08:00
|
|
|
#include "zend_cpuinfo.h"
|
2020-06-05 16:36:35 +08:00
|
|
|
#include "zend_attributes.h"
|
2020-09-01 23:57:49 +08:00
|
|
|
#include "zend_observer.h"
|
2021-04-27 00:07:06 +08:00
|
|
|
#include "zend_fibers.h"
|
2022-12-17 00:44:26 +08:00
|
|
|
#include "zend_call_stack.h"
|
2023-03-03 18:35:06 +08:00
|
|
|
#include "zend_max_execution_timer.h"
|
2023-07-16 18:34:28 +08:00
|
|
|
#include "zend_hrtime.h"
|
2021-01-26 22:53:49 +08:00
|
|
|
#include "Optimizer/zend_optimizer.h"
|
2023-04-01 03:37:45 +08:00
|
|
|
#include "php.h"
|
|
|
|
#include "php_globals.h"
|
|
|
|
|
|
|
|
// FIXME: Breaks the declaration of the function below
|
|
|
|
#undef zenderror
|
1999-04-08 02:10:10 +08:00
|
|
|
|
2018-10-17 20:52:50 +08:00
|
|
|
static size_t global_map_ptr_last = 0;
|
2021-08-11 16:28:52 +08:00
|
|
|
static bool startup_done = false;
|
2018-10-17 20:52:50 +08:00
|
|
|
|
1999-04-21 11:49:09 +08:00
|
|
|
#ifdef ZTS
|
2017-01-16 04:27:05 +08:00
|
|
|
ZEND_API int compiler_globals_id;
|
|
|
|
ZEND_API int executor_globals_id;
|
2019-03-14 08:01:01 +08:00
|
|
|
ZEND_API size_t compiler_globals_offset;
|
|
|
|
ZEND_API size_t executor_globals_offset;
|
2017-01-16 04:27:05 +08:00
|
|
|
static HashTable *global_function_table = NULL;
|
|
|
|
static HashTable *global_class_table = NULL;
|
|
|
|
static HashTable *global_constants_table = NULL;
|
|
|
|
static HashTable *global_auto_globals_table = NULL;
|
|
|
|
static HashTable *global_persistent_list = NULL;
|
2021-11-25 01:43:30 +08:00
|
|
|
TSRMLS_MAIN_CACHE_DEFINE()
|
2007-11-03 03:40:39 +08:00
|
|
|
# define GLOBAL_FUNCTION_TABLE global_function_table
|
|
|
|
# define GLOBAL_CLASS_TABLE global_class_table
|
|
|
|
# define GLOBAL_CONSTANTS_TABLE global_constants_table
|
|
|
|
# define GLOBAL_AUTO_GLOBALS_TABLE global_auto_globals_table
|
1999-04-21 11:49:09 +08:00
|
|
|
#else
|
2007-11-03 03:40:39 +08:00
|
|
|
# define GLOBAL_FUNCTION_TABLE CG(function_table)
|
|
|
|
# define GLOBAL_CLASS_TABLE CG(class_table)
|
|
|
|
# define GLOBAL_AUTO_GLOBALS_TABLE CG(auto_globals)
|
|
|
|
# define GLOBAL_CONSTANTS_TABLE EG(zend_constants)
|
1999-04-21 11:49:09 +08:00
|
|
|
#endif
|
|
|
|
|
2017-01-16 04:27:05 +08:00
|
|
|
ZEND_API zend_utility_values zend_uv;
|
2021-01-15 19:30:54 +08:00
|
|
|
ZEND_API bool zend_dtrace_enabled;
|
2017-01-16 04:27:05 +08:00
|
|
|
|
|
|
|
/* version information */
|
|
|
|
static char *zend_version_info;
|
|
|
|
static uint32_t zend_version_info_length;
|
2019-01-30 17:26:28 +08:00
|
|
|
#define ZEND_CORE_VERSION_INFO "Zend Engine v" ZEND_VERSION ", Copyright (c) Zend Technologies\n"
|
2017-01-16 04:27:05 +08:00
|
|
|
#define PRINT_ZVAL_INDENT 4
|
|
|
|
|
1999-04-08 02:10:10 +08:00
|
|
|
/* true multithread-shared globals */
|
2002-03-12 18:08:47 +08:00
|
|
|
ZEND_API zend_class_entry *zend_standard_class_def = NULL;
|
2014-08-26 01:24:55 +08:00
|
|
|
ZEND_API size_t (*zend_printf)(const char *format, ...);
|
2000-03-26 03:10:07 +08:00
|
|
|
ZEND_API zend_write_func_t zend_write;
|
2021-03-17 01:31:36 +08:00
|
|
|
ZEND_API FILE *(*zend_fopen)(zend_string *filename, zend_string **opened_path);
|
|
|
|
ZEND_API zend_result (*zend_stream_open_function)(zend_file_handle *handle);
|
2014-12-14 06:06:14 +08:00
|
|
|
ZEND_API void (*zend_ticks_function)(int ticks);
|
2016-06-23 20:01:23 +08:00
|
|
|
ZEND_API void (*zend_interrupt_function)(zend_execute_data *execute_data);
|
2021-04-23 16:47:08 +08:00
|
|
|
ZEND_API void (*zend_error_cb)(int type, zend_string *error_filename, const uint32_t error_lineno, zend_string *message);
|
2016-12-19 00:53:27 +08:00
|
|
|
void (*zend_printf_to_smart_string)(smart_string *buf, const char *format, va_list ap);
|
|
|
|
void (*zend_printf_to_smart_str)(smart_str *buf, const char *format, va_list ap);
|
2020-06-07 17:01:19 +08:00
|
|
|
ZEND_API char *(*zend_getenv)(const char *name, size_t name_len);
|
2021-03-17 01:31:36 +08:00
|
|
|
ZEND_API zend_string *(*zend_resolve_path)(zend_string *filename);
|
2020-08-28 21:41:27 +08:00
|
|
|
ZEND_API zend_result (*zend_post_startup_cb)(void) = NULL;
|
2018-10-26 01:30:51 +08:00
|
|
|
ZEND_API void (*zend_post_shutdown_cb)(void) = NULL;
|
2024-09-24 22:24:01 +08:00
|
|
|
ZEND_API void (*zend_accel_schedule_restart_hook)(int reason) = NULL;
|
2024-06-12 19:57:54 +08:00
|
|
|
ZEND_ATTRIBUTE_NONNULL ZEND_API zend_result (*zend_random_bytes)(void *bytes, size_t size, char *errstr, size_t errstr_size) = NULL;
|
|
|
|
ZEND_ATTRIBUTE_NONNULL ZEND_API void (*zend_random_bytes_insecure)(zend_random_bytes_insecure_state *state, void *bytes, size_t size) = NULL;
|
2000-06-19 00:02:32 +08:00
|
|
|
|
2020-05-11 21:05:01 +08:00
|
|
|
/* This callback must be signal handler safe! */
|
2014-12-14 06:06:14 +08:00
|
|
|
void (*zend_on_timeout)(int seconds);
|
2002-09-19 23:58:01 +08:00
|
|
|
|
2014-12-14 06:06:14 +08:00
|
|
|
static void (*zend_message_dispatcher_p)(zend_long message, const void *data);
|
2014-09-02 00:57:33 +08:00
|
|
|
static zval *(*zend_get_configuration_directive_p)(zend_string *name);
|
1999-06-20 04:42:15 +08:00
|
|
|
|
2023-04-04 15:00:14 +08:00
|
|
|
#if ZEND_RC_DEBUG
|
|
|
|
ZEND_API bool zend_rc_debug = 0;
|
|
|
|
#endif
|
|
|
|
|
2007-11-03 03:40:39 +08:00
|
|
|
static ZEND_INI_MH(OnUpdateErrorReporting) /* {{{ */
|
2002-11-20 01:51:30 +08:00
|
|
|
{
|
|
|
|
if (!new_value) {
|
2019-08-30 16:31:32 +08:00
|
|
|
EG(error_reporting) = E_ALL;
|
2002-11-20 01:51:30 +08:00
|
|
|
} else {
|
2015-06-30 18:59:27 +08:00
|
|
|
EG(error_reporting) = atoi(ZSTR_VAL(new_value));
|
2002-11-20 01:51:30 +08:00
|
|
|
}
|
|
|
|
return SUCCESS;
|
|
|
|
}
|
2007-11-03 03:40:39 +08:00
|
|
|
/* }}} */
|
2002-11-20 01:51:30 +08:00
|
|
|
|
2008-01-22 17:27:48 +08:00
|
|
|
static ZEND_INI_MH(OnUpdateGCEnabled) /* {{{ */
|
|
|
|
{
|
2021-01-15 19:30:54 +08:00
|
|
|
bool val;
|
2018-02-26 17:49:58 +08:00
|
|
|
|
2018-03-05 16:51:58 +08:00
|
|
|
val = zend_ini_parse_bool(new_value);
|
2018-03-02 16:02:21 +08:00
|
|
|
gc_enable(val);
|
2018-02-26 17:49:58 +08:00
|
|
|
|
2008-01-22 17:27:48 +08:00
|
|
|
return SUCCESS;
|
|
|
|
}
|
|
|
|
/* }}} */
|
|
|
|
|
2018-02-26 17:49:58 +08:00
|
|
|
static ZEND_INI_DISP(zend_gc_enabled_displayer_cb) /* {{{ */
|
|
|
|
{
|
|
|
|
if (gc_enabled()) {
|
|
|
|
ZEND_PUTS("On");
|
|
|
|
} else {
|
|
|
|
ZEND_PUTS("Off");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/* }}} */
|
|
|
|
|
|
|
|
|
2010-12-20 00:36:37 +08:00
|
|
|
static ZEND_INI_MH(OnUpdateScriptEncoding) /* {{{ */
|
|
|
|
{
|
2014-12-24 00:33:30 +08:00
|
|
|
if (!CG(multibyte)) {
|
2010-12-20 00:36:37 +08:00
|
|
|
return FAILURE;
|
|
|
|
}
|
2014-12-14 06:06:14 +08:00
|
|
|
if (!zend_multibyte_get_functions()) {
|
2010-12-20 00:36:37 +08:00
|
|
|
return SUCCESS;
|
|
|
|
}
|
2015-06-30 18:59:27 +08:00
|
|
|
return zend_multibyte_set_script_encoding_by_string(new_value ? ZSTR_VAL(new_value) : NULL, new_value ? ZSTR_LEN(new_value) : 0);
|
2010-12-20 00:36:37 +08:00
|
|
|
}
|
|
|
|
/* }}} */
|
|
|
|
|
2015-03-02 17:25:40 +08:00
|
|
|
static ZEND_INI_MH(OnUpdateAssertions) /* {{{ */
|
|
|
|
{
|
2020-04-27 16:21:26 +08:00
|
|
|
zend_long *p = (zend_long *) ZEND_INI_GET_ADDR();
|
2015-03-02 17:25:40 +08:00
|
|
|
|
2022-06-17 20:12:53 +08:00
|
|
|
zend_long val = zend_ini_parse_quantity_warn(new_value, entry->name);
|
2015-03-02 17:25:40 +08:00
|
|
|
|
|
|
|
if (stage != ZEND_INI_STAGE_STARTUP &&
|
|
|
|
stage != ZEND_INI_STAGE_SHUTDOWN &&
|
|
|
|
*p != val &&
|
|
|
|
(*p < 0 || val < 0)) {
|
|
|
|
zend_error(E_WARNING, "zend.assertions may be completely enabled or disabled only in php.ini");
|
|
|
|
return FAILURE;
|
|
|
|
}
|
|
|
|
|
|
|
|
*p = val;
|
|
|
|
return SUCCESS;
|
|
|
|
}
|
|
|
|
/* }}} */
|
2010-12-20 00:36:37 +08:00
|
|
|
|
2020-06-25 21:44:12 +08:00
|
|
|
static ZEND_INI_MH(OnSetExceptionStringParamMaxLen) /* {{{ */
|
|
|
|
{
|
2021-07-12 22:51:24 +08:00
|
|
|
zend_long i = ZEND_ATOL(ZSTR_VAL(new_value));
|
2020-06-25 21:44:12 +08:00
|
|
|
if (i >= 0 && i <= 1000000) {
|
|
|
|
EG(exception_string_param_max_len) = i;
|
|
|
|
return SUCCESS;
|
|
|
|
} else {
|
|
|
|
return FAILURE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/* }}} */
|
|
|
|
|
2022-12-17 00:44:26 +08:00
|
|
|
#ifdef ZEND_CHECK_STACK_LIMIT
|
|
|
|
static ZEND_INI_MH(OnUpdateMaxAllowedStackSize) /* {{{ */
|
|
|
|
{
|
|
|
|
zend_long size = zend_ini_parse_quantity_warn(new_value, entry->name);
|
|
|
|
|
|
|
|
if (size < ZEND_MAX_ALLOWED_STACK_SIZE_UNCHECKED) {
|
|
|
|
zend_error(E_WARNING, "Invalid \"%s\" setting. Value must be >= %d, but got " ZEND_LONG_FMT,
|
|
|
|
ZSTR_VAL(entry->name), ZEND_MAX_ALLOWED_STACK_SIZE_UNCHECKED, size);
|
|
|
|
return FAILURE;
|
|
|
|
}
|
|
|
|
|
|
|
|
EG(max_allowed_stack_size) = size;
|
|
|
|
|
|
|
|
return SUCCESS;
|
|
|
|
}
|
|
|
|
/* }}} */
|
|
|
|
|
|
|
|
static ZEND_INI_MH(OnUpdateReservedStackSize) /* {{{ */
|
|
|
|
{
|
|
|
|
zend_ulong size = zend_ini_parse_uquantity_warn(new_value, entry->name);
|
|
|
|
|
|
|
|
/* Min value accounts for alloca, PCRE2 START_FRAMES_SIZE, and some buffer
|
|
|
|
* for normal function calls.
|
|
|
|
* We could reduce this on systems without alloca if we also add stack size
|
|
|
|
* checks before pcre2_match(). */
|
|
|
|
#ifdef ZEND_ALLOCA_MAX_SIZE
|
|
|
|
zend_ulong min = ZEND_ALLOCA_MAX_SIZE + 16*1024;
|
|
|
|
#else
|
|
|
|
zend_ulong min = 32*1024;
|
|
|
|
#endif
|
|
|
|
|
2024-07-05 07:52:42 +08:00
|
|
|
#if defined(__SANITIZE_ADDRESS__) || __has_feature(memory_sanitizer)
|
2024-07-04 01:23:34 +08:00
|
|
|
/* AddressSanitizer and MemorySanitizer use more stack due to
|
|
|
|
* instrumentation */
|
|
|
|
min *= 10;
|
|
|
|
#endif
|
|
|
|
|
2022-12-17 00:44:26 +08:00
|
|
|
if (size == 0) {
|
|
|
|
size = min;
|
|
|
|
} else if (size < min) {
|
|
|
|
zend_error(E_WARNING, "Invalid \"%s\" setting. Value must be >= " ZEND_ULONG_FMT ", but got " ZEND_ULONG_FMT "\n",
|
|
|
|
ZSTR_VAL(entry->name), min, size);
|
|
|
|
return FAILURE;
|
|
|
|
}
|
|
|
|
|
|
|
|
EG(reserved_stack_size) = size;
|
|
|
|
|
|
|
|
return SUCCESS;
|
|
|
|
}
|
|
|
|
/* }}} */
|
|
|
|
#endif /* ZEND_CHECK_STACK_LIMIT */
|
|
|
|
|
2021-04-27 00:07:06 +08:00
|
|
|
static ZEND_INI_MH(OnUpdateFiberStackSize) /* {{{ */
|
|
|
|
{
|
|
|
|
if (new_value) {
|
2023-11-01 21:26:32 +08:00
|
|
|
zend_long tmp = zend_ini_parse_quantity_warn(new_value, entry->name);
|
2023-11-01 21:13:17 +08:00
|
|
|
if (tmp < 0) {
|
|
|
|
zend_error(E_WARNING, "fiber.stack_size must be a positive number");
|
|
|
|
return FAILURE;
|
|
|
|
}
|
|
|
|
EG(fiber_stack_size) = tmp;
|
2021-04-27 00:07:06 +08:00
|
|
|
} else {
|
|
|
|
EG(fiber_stack_size) = ZEND_FIBER_DEFAULT_C_STACK_SIZE;
|
|
|
|
}
|
|
|
|
return SUCCESS;
|
|
|
|
}
|
|
|
|
/* }}} */
|
|
|
|
|
2020-06-18 16:15:53 +08:00
|
|
|
#if ZEND_DEBUG
|
|
|
|
# define SIGNAL_CHECK_DEFAULT "1"
|
|
|
|
#else
|
|
|
|
# define SIGNAL_CHECK_DEFAULT "0"
|
|
|
|
#endif
|
|
|
|
|
2002-11-20 01:51:30 +08:00
|
|
|
ZEND_INI_BEGIN()
|
2004-02-25 18:57:10 +08:00
|
|
|
ZEND_INI_ENTRY("error_reporting", NULL, ZEND_INI_ALL, OnUpdateErrorReporting)
|
2015-10-06 16:13:38 +08:00
|
|
|
STD_ZEND_INI_ENTRY("zend.assertions", "1", ZEND_INI_ALL, OnUpdateAssertions, assertions, zend_executor_globals, executor_globals)
|
2018-02-26 17:49:58 +08:00
|
|
|
ZEND_INI_ENTRY3_EX("zend.enable_gc", "1", ZEND_INI_ALL, OnUpdateGCEnabled, NULL, NULL, NULL, zend_gc_enabled_displayer_cb)
|
2021-06-29 16:04:10 +08:00
|
|
|
STD_ZEND_INI_BOOLEAN("zend.multibyte", "0", ZEND_INI_PERDIR, OnUpdateBool, multibyte, zend_compiler_globals, compiler_globals)
|
|
|
|
ZEND_INI_ENTRY("zend.script_encoding", NULL, ZEND_INI_ALL, OnUpdateScriptEncoding)
|
|
|
|
STD_ZEND_INI_BOOLEAN("zend.detect_unicode", "1", ZEND_INI_ALL, OnUpdateBool, detect_unicode, zend_compiler_globals, compiler_globals)
|
2011-06-22 22:23:21 +08:00
|
|
|
#ifdef ZEND_SIGNALS
|
2020-06-18 16:15:53 +08:00
|
|
|
STD_ZEND_INI_BOOLEAN("zend.signal_check", SIGNAL_CHECK_DEFAULT, ZEND_INI_SYSTEM, OnUpdateBool, check, zend_signal_globals_t, zend_signal_globals)
|
2011-06-22 22:23:21 +08:00
|
|
|
#endif
|
2019-06-18 02:51:52 +08:00
|
|
|
STD_ZEND_INI_BOOLEAN("zend.exception_ignore_args", "0", ZEND_INI_ALL, OnUpdateBool, exception_ignore_args, zend_executor_globals, executor_globals)
|
2020-06-25 21:44:12 +08:00
|
|
|
STD_ZEND_INI_ENTRY("zend.exception_string_param_max_len", "15", ZEND_INI_ALL, OnSetExceptionStringParamMaxLen, exception_string_param_max_len, zend_executor_globals, executor_globals)
|
2021-04-27 00:07:06 +08:00
|
|
|
STD_ZEND_INI_ENTRY("fiber.stack_size", NULL, ZEND_INI_ALL, OnUpdateFiberStackSize, fiber_stack_size, zend_executor_globals, executor_globals)
|
2022-12-17 00:44:26 +08:00
|
|
|
#ifdef ZEND_CHECK_STACK_LIMIT
|
|
|
|
/* The maximum allowed call stack size. 0: auto detect, -1: no limit. For fibers, this is fiber.stack_size. */
|
|
|
|
STD_ZEND_INI_ENTRY("zend.max_allowed_stack_size", "0", ZEND_INI_SYSTEM, OnUpdateMaxAllowedStackSize, max_allowed_stack_size, zend_executor_globals, executor_globals)
|
2024-09-24 16:55:21 +08:00
|
|
|
/* Subtracted from the max allowed stack size, as a buffer, when checking for overflow. 0: auto detect. */
|
2022-12-17 00:44:26 +08:00
|
|
|
STD_ZEND_INI_ENTRY("zend.reserved_stack_size", "0", ZEND_INI_SYSTEM, OnUpdateReservedStackSize, reserved_stack_size, zend_executor_globals, executor_globals)
|
|
|
|
#endif
|
2021-04-27 00:07:06 +08:00
|
|
|
|
2002-11-20 01:51:30 +08:00
|
|
|
ZEND_INI_END()
|
|
|
|
|
2016-12-19 00:53:27 +08:00
|
|
|
ZEND_API size_t zend_vspprintf(char **pbuf, size_t max_len, const char *format, va_list ap) /* {{{ */
|
|
|
|
{
|
|
|
|
smart_string buf = {0};
|
|
|
|
|
|
|
|
/* since there are places where (v)spprintf called without checking for null,
|
|
|
|
a bit of defensive coding here */
|
|
|
|
if (!pbuf) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
zend_printf_to_smart_string(&buf, format, ap);
|
|
|
|
|
|
|
|
if (max_len && buf.len > max_len) {
|
|
|
|
buf.len = max_len;
|
|
|
|
}
|
|
|
|
|
|
|
|
smart_string_0(&buf);
|
|
|
|
|
|
|
|
if (buf.c) {
|
|
|
|
*pbuf = buf.c;
|
|
|
|
return buf.len;
|
|
|
|
} else {
|
|
|
|
*pbuf = estrndup("", 0);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/* }}} */
|
|
|
|
|
2016-12-19 00:31:00 +08:00
|
|
|
ZEND_API size_t zend_spprintf(char **message, size_t max_len, const char *format, ...) /* {{{ */
|
|
|
|
{
|
|
|
|
va_list arg;
|
|
|
|
size_t len;
|
|
|
|
|
|
|
|
va_start(arg, format);
|
|
|
|
len = zend_vspprintf(message, max_len, format, arg);
|
|
|
|
va_end(arg);
|
|
|
|
return len;
|
|
|
|
}
|
|
|
|
/* }}} */
|
|
|
|
|
2017-11-16 19:29:27 +08:00
|
|
|
ZEND_API size_t zend_spprintf_unchecked(char **message, size_t max_len, const char *format, ...) /* {{{ */
|
|
|
|
{
|
|
|
|
va_list arg;
|
|
|
|
size_t len;
|
|
|
|
|
|
|
|
va_start(arg, format);
|
|
|
|
len = zend_vspprintf(message, max_len, format, arg);
|
|
|
|
va_end(arg);
|
|
|
|
return len;
|
|
|
|
}
|
|
|
|
/* }}} */
|
|
|
|
|
2016-12-19 00:53:27 +08:00
|
|
|
ZEND_API zend_string *zend_vstrpprintf(size_t max_len, const char *format, va_list ap) /* {{{ */
|
|
|
|
{
|
|
|
|
smart_str buf = {0};
|
|
|
|
|
|
|
|
zend_printf_to_smart_str(&buf, format, ap);
|
|
|
|
|
|
|
|
if (!buf.s) {
|
|
|
|
return ZSTR_EMPTY_ALLOC();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (max_len && ZSTR_LEN(buf.s) > max_len) {
|
|
|
|
ZSTR_LEN(buf.s) = max_len;
|
|
|
|
}
|
|
|
|
|
2022-07-08 20:47:46 +08:00
|
|
|
return smart_str_extract(&buf);
|
2016-12-19 00:53:27 +08:00
|
|
|
}
|
|
|
|
/* }}} */
|
|
|
|
|
2016-12-19 00:31:00 +08:00
|
|
|
ZEND_API zend_string *zend_strpprintf(size_t max_len, const char *format, ...) /* {{{ */
|
|
|
|
{
|
|
|
|
va_list arg;
|
|
|
|
zend_string *str;
|
|
|
|
|
|
|
|
va_start(arg, format);
|
|
|
|
str = zend_vstrpprintf(max_len, format, arg);
|
|
|
|
va_end(arg);
|
|
|
|
return str;
|
|
|
|
}
|
|
|
|
/* }}} */
|
|
|
|
|
2017-11-16 19:29:27 +08:00
|
|
|
ZEND_API zend_string *zend_strpprintf_unchecked(size_t max_len, const char *format, ...) /* {{{ */
|
|
|
|
{
|
|
|
|
va_list arg;
|
|
|
|
zend_string *str;
|
|
|
|
|
|
|
|
va_start(arg, format);
|
|
|
|
str = zend_vstrpprintf(max_len, format, arg);
|
|
|
|
va_end(arg);
|
|
|
|
return str;
|
|
|
|
}
|
|
|
|
/* }}} */
|
|
|
|
|
2015-10-07 17:35:43 +08:00
|
|
|
static void zend_print_zval_r_to_buf(smart_str *buf, zval *expr, int indent);
|
|
|
|
|
2021-01-15 19:30:54 +08:00
|
|
|
static void print_hash(smart_str *buf, HashTable *ht, int indent, bool is_object) /* {{{ */
|
1999-04-08 02:10:10 +08:00
|
|
|
{
|
2014-02-10 14:04:30 +08:00
|
|
|
zval *tmp;
|
|
|
|
zend_string *string_key;
|
2014-08-26 01:24:55 +08:00
|
|
|
zend_ulong num_key;
|
1999-04-08 02:10:10 +08:00
|
|
|
int i;
|
|
|
|
|
2007-11-03 03:40:39 +08:00
|
|
|
for (i = 0; i < indent; i++) {
|
2015-10-07 17:35:43 +08:00
|
|
|
smart_str_appendc(buf, ' ');
|
1999-04-08 02:10:10 +08:00
|
|
|
}
|
2015-10-07 17:35:43 +08:00
|
|
|
smart_str_appends(buf, "(\n");
|
1999-12-22 01:14:31 +08:00
|
|
|
indent += PRINT_ZVAL_INDENT;
|
2015-10-07 17:35:43 +08:00
|
|
|
ZEND_HASH_FOREACH_KEY_VAL_IND(ht, num_key, string_key, tmp) {
|
2007-11-03 03:40:39 +08:00
|
|
|
for (i = 0; i < indent; i++) {
|
2015-10-07 17:35:43 +08:00
|
|
|
smart_str_appendc(buf, ' ');
|
1999-04-08 02:10:10 +08:00
|
|
|
}
|
2015-10-07 17:35:43 +08:00
|
|
|
smart_str_appendc(buf, '[');
|
2014-04-18 23:18:11 +08:00
|
|
|
if (string_key) {
|
|
|
|
if (is_object) {
|
|
|
|
const char *prop_name, *class_name;
|
2014-09-16 06:23:58 +08:00
|
|
|
size_t prop_len;
|
|
|
|
int mangled = zend_unmangle_property_name_ex(string_key, &class_name, &prop_name, &prop_len);
|
2014-04-18 23:18:11 +08:00
|
|
|
|
2015-10-07 17:35:43 +08:00
|
|
|
smart_str_appendl(buf, prop_name, prop_len);
|
2014-04-18 23:18:11 +08:00
|
|
|
if (class_name && mangled == SUCCESS) {
|
2015-10-07 17:35:43 +08:00
|
|
|
if (class_name[0] == '*') {
|
|
|
|
smart_str_appends(buf, ":protected");
|
2014-04-18 23:18:11 +08:00
|
|
|
} else {
|
2015-10-07 17:35:43 +08:00
|
|
|
smart_str_appends(buf, ":");
|
|
|
|
smart_str_appends(buf, class_name);
|
|
|
|
smart_str_appends(buf, ":private");
|
2003-06-09 02:53:58 +08:00
|
|
|
}
|
2009-02-18 18:55:08 +08:00
|
|
|
}
|
2014-04-18 23:18:11 +08:00
|
|
|
} else {
|
2015-10-07 17:35:43 +08:00
|
|
|
smart_str_append(buf, string_key);
|
2014-04-18 23:18:11 +08:00
|
|
|
}
|
|
|
|
} else {
|
2015-10-07 17:35:43 +08:00
|
|
|
smart_str_append_long(buf, num_key);
|
1999-04-08 02:10:10 +08:00
|
|
|
}
|
2015-10-07 17:35:43 +08:00
|
|
|
smart_str_appends(buf, "] => ");
|
|
|
|
zend_print_zval_r_to_buf(buf, tmp, indent+PRINT_ZVAL_INDENT);
|
|
|
|
smart_str_appends(buf, "\n");
|
2014-04-18 23:18:11 +08:00
|
|
|
} ZEND_HASH_FOREACH_END();
|
1999-12-22 01:14:31 +08:00
|
|
|
indent -= PRINT_ZVAL_INDENT;
|
2007-11-03 03:40:39 +08:00
|
|
|
for (i = 0; i < indent; i++) {
|
2015-10-07 17:35:43 +08:00
|
|
|
smart_str_appendc(buf, ' ');
|
1999-04-08 02:10:10 +08:00
|
|
|
}
|
2015-10-07 17:35:43 +08:00
|
|
|
smart_str_appends(buf, ")\n");
|
1999-04-08 02:10:10 +08:00
|
|
|
}
|
2007-11-03 03:40:39 +08:00
|
|
|
/* }}} */
|
1999-04-08 02:10:10 +08:00
|
|
|
|
2021-04-15 17:46:30 +08:00
|
|
|
static void print_flat_hash(smart_str *buf, HashTable *ht) /* {{{ */
|
2002-12-02 03:47:02 +08:00
|
|
|
{
|
2014-02-10 14:04:30 +08:00
|
|
|
zval *tmp;
|
|
|
|
zend_string *string_key;
|
2014-08-26 01:24:55 +08:00
|
|
|
zend_ulong num_key;
|
2007-11-03 03:40:39 +08:00
|
|
|
int i = 0;
|
|
|
|
|
2014-05-26 02:07:29 +08:00
|
|
|
ZEND_HASH_FOREACH_KEY_VAL_IND(ht, num_key, string_key, tmp) {
|
2007-11-03 03:40:39 +08:00
|
|
|
if (i++ > 0) {
|
2021-04-15 17:46:30 +08:00
|
|
|
smart_str_appendc(buf, ',');
|
2007-11-03 03:40:39 +08:00
|
|
|
}
|
2021-04-15 17:46:30 +08:00
|
|
|
smart_str_appendc(buf, '[');
|
2014-04-18 23:18:11 +08:00
|
|
|
if (string_key) {
|
2021-04-15 17:46:30 +08:00
|
|
|
smart_str_append(buf, string_key);
|
2014-04-18 23:18:11 +08:00
|
|
|
} else {
|
2021-04-15 17:46:30 +08:00
|
|
|
smart_str_append_unsigned(buf, num_key);
|
2007-11-03 03:40:39 +08:00
|
|
|
}
|
2021-04-15 17:46:30 +08:00
|
|
|
smart_str_appends(buf, "] => ");
|
|
|
|
zend_print_flat_zval_r_to_buf(buf, tmp);
|
2014-04-18 23:18:11 +08:00
|
|
|
} ZEND_HASH_FOREACH_END();
|
2002-12-02 03:47:02 +08:00
|
|
|
}
|
2007-11-03 03:40:39 +08:00
|
|
|
/* }}} */
|
1999-04-21 11:49:09 +08:00
|
|
|
|
2020-08-28 21:41:27 +08:00
|
|
|
ZEND_API bool zend_make_printable_zval(zval *expr, zval *expr_copy) /* {{{ */
|
1999-04-08 02:10:10 +08:00
|
|
|
{
|
2014-03-07 13:48:28 +08:00
|
|
|
if (Z_TYPE_P(expr) == IS_STRING) {
|
2014-07-09 20:05:55 +08:00
|
|
|
return 0;
|
2014-09-23 12:56:59 +08:00
|
|
|
} else {
|
2017-11-16 22:09:01 +08:00
|
|
|
ZVAL_STR(expr_copy, zval_get_string_func(expr));
|
2014-09-23 12:56:59 +08:00
|
|
|
return 1;
|
1999-06-11 18:44:26 +08:00
|
|
|
}
|
|
|
|
}
|
2007-11-03 03:40:39 +08:00
|
|
|
/* }}} */
|
1999-06-11 18:44:26 +08:00
|
|
|
|
2014-12-14 06:06:14 +08:00
|
|
|
ZEND_API size_t zend_print_zval(zval *expr, int indent) /* {{{ */
|
1999-06-11 18:44:26 +08:00
|
|
|
{
|
2017-11-16 22:09:32 +08:00
|
|
|
zend_string *tmp_str;
|
|
|
|
zend_string *str = zval_get_tmp_string(expr, &tmp_str);
|
2015-06-30 18:59:27 +08:00
|
|
|
size_t len = ZSTR_LEN(str);
|
1999-06-11 18:44:26 +08:00
|
|
|
|
2014-04-21 23:12:10 +08:00
|
|
|
if (len != 0) {
|
2015-10-07 17:35:43 +08:00
|
|
|
zend_write(ZSTR_VAL(str), len);
|
1999-04-08 02:10:10 +08:00
|
|
|
}
|
2014-04-21 23:12:10 +08:00
|
|
|
|
2017-11-16 22:09:32 +08:00
|
|
|
zend_tmp_string_release(tmp_str);
|
2014-04-21 23:12:10 +08:00
|
|
|
return len;
|
1999-04-08 02:10:10 +08:00
|
|
|
}
|
2007-11-03 03:40:39 +08:00
|
|
|
/* }}} */
|
1999-04-08 02:10:10 +08:00
|
|
|
|
2021-04-15 17:26:42 +08:00
|
|
|
void zend_print_flat_zval_r_to_buf(smart_str *buf, zval *expr) /* {{{ */
|
2002-12-02 03:47:02 +08:00
|
|
|
{
|
2007-11-03 03:40:39 +08:00
|
|
|
switch (Z_TYPE_P(expr)) {
|
|
|
|
case IS_ARRAY:
|
2021-04-15 17:46:30 +08:00
|
|
|
smart_str_appends(buf, "Array (");
|
2019-01-02 16:42:21 +08:00
|
|
|
if (!(GC_FLAGS(Z_ARRVAL_P(expr)) & GC_IMMUTABLE)) {
|
|
|
|
if (GC_IS_RECURSIVE(Z_ARRVAL_P(expr))) {
|
2021-04-15 17:46:30 +08:00
|
|
|
smart_str_appends(buf, " *RECURSION*");
|
2017-10-06 06:34:50 +08:00
|
|
|
return;
|
|
|
|
}
|
2019-01-02 16:42:21 +08:00
|
|
|
GC_PROTECT_RECURSION(Z_ARRVAL_P(expr));
|
2007-11-03 03:40:39 +08:00
|
|
|
}
|
2021-04-15 17:46:30 +08:00
|
|
|
print_flat_hash(buf, Z_ARRVAL_P(expr));
|
|
|
|
smart_str_appendc(buf, ')');
|
2020-09-15 17:38:40 +08:00
|
|
|
GC_TRY_UNPROTECT_RECURSION(Z_ARRVAL_P(expr));
|
2007-11-03 03:40:39 +08:00
|
|
|
break;
|
|
|
|
case IS_OBJECT:
|
|
|
|
{
|
2018-10-04 16:56:43 +08:00
|
|
|
HashTable *properties;
|
2014-12-14 06:06:14 +08:00
|
|
|
zend_string *class_name = Z_OBJ_HANDLER_P(expr, get_class_name)(Z_OBJ_P(expr));
|
2021-04-15 17:46:30 +08:00
|
|
|
smart_str_append(buf, class_name);
|
|
|
|
smart_str_appends(buf, " Object (");
|
2018-05-28 21:27:12 +08:00
|
|
|
zend_string_release_ex(class_name, 0);
|
2007-10-11 09:03:19 +08:00
|
|
|
|
2019-01-02 16:42:21 +08:00
|
|
|
if (GC_IS_RECURSIVE(Z_COUNTED_P(expr))) {
|
2021-04-15 17:46:30 +08:00
|
|
|
smart_str_appends(buf, " *RECURSION*");
|
2015-04-16 03:07:34 +08:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2018-10-04 16:56:43 +08:00
|
|
|
properties = Z_OBJPROP_P(expr);
|
2003-01-14 20:13:51 +08:00
|
|
|
if (properties) {
|
2019-01-02 16:42:21 +08:00
|
|
|
GC_PROTECT_RECURSION(Z_OBJ_P(expr));
|
2021-04-15 17:46:30 +08:00
|
|
|
print_flat_hash(buf, properties);
|
2019-01-02 16:42:21 +08:00
|
|
|
GC_UNPROTECT_RECURSION(Z_OBJ_P(expr));
|
2003-01-12 21:45:50 +08:00
|
|
|
}
|
2021-04-15 17:46:30 +08:00
|
|
|
smart_str_appendc(buf, ')');
|
2003-01-12 21:45:50 +08:00
|
|
|
break;
|
2007-11-03 03:40:39 +08:00
|
|
|
}
|
2016-07-12 05:28:14 +08:00
|
|
|
case IS_REFERENCE:
|
2021-04-15 17:46:30 +08:00
|
|
|
zend_print_flat_zval_r_to_buf(buf, Z_REFVAL_P(expr));
|
|
|
|
break;
|
|
|
|
case IS_STRING:
|
|
|
|
smart_str_append(buf, Z_STR_P(expr));
|
2016-07-12 05:28:14 +08:00
|
|
|
break;
|
2007-11-03 03:40:39 +08:00
|
|
|
default:
|
2021-04-15 17:46:30 +08:00
|
|
|
{
|
|
|
|
zend_string *str = zval_get_string_func(expr);
|
|
|
|
smart_str_append(buf, str);
|
|
|
|
zend_string_release_ex(str, 0);
|
2007-11-03 03:40:39 +08:00
|
|
|
break;
|
2021-04-15 17:46:30 +08:00
|
|
|
}
|
2007-11-03 03:40:39 +08:00
|
|
|
}
|
2002-12-02 03:47:02 +08:00
|
|
|
}
|
2007-11-03 03:40:39 +08:00
|
|
|
/* }}} */
|
1999-04-08 02:10:10 +08:00
|
|
|
|
2021-04-15 17:46:30 +08:00
|
|
|
ZEND_API void zend_print_flat_zval_r(zval *expr)
|
|
|
|
{
|
|
|
|
smart_str buf = {0};
|
|
|
|
zend_print_flat_zval_r_to_buf(&buf, expr);
|
|
|
|
smart_str_0(&buf);
|
|
|
|
zend_write(ZSTR_VAL(buf.s), ZSTR_LEN(buf.s));
|
|
|
|
smart_str_free(&buf);
|
|
|
|
}
|
|
|
|
|
2015-10-07 17:35:43 +08:00
|
|
|
static void zend_print_zval_r_to_buf(smart_str *buf, zval *expr, int indent) /* {{{ */
|
1999-04-08 02:10:10 +08:00
|
|
|
{
|
2007-11-03 03:40:39 +08:00
|
|
|
switch (Z_TYPE_P(expr)) {
|
1999-04-08 02:10:10 +08:00
|
|
|
case IS_ARRAY:
|
2015-10-07 17:35:43 +08:00
|
|
|
smart_str_appends(buf, "Array\n");
|
2019-01-02 16:42:21 +08:00
|
|
|
if (!(GC_FLAGS(Z_ARRVAL_P(expr)) & GC_IMMUTABLE)) {
|
|
|
|
if (GC_IS_RECURSIVE(Z_ARRVAL_P(expr))) {
|
2017-10-06 06:34:50 +08:00
|
|
|
smart_str_appends(buf, " *RECURSION*");
|
|
|
|
return;
|
|
|
|
}
|
2019-01-02 16:42:21 +08:00
|
|
|
GC_PROTECT_RECURSION(Z_ARRVAL_P(expr));
|
2000-11-03 07:17:55 +08:00
|
|
|
}
|
2015-10-07 17:35:43 +08:00
|
|
|
print_hash(buf, Z_ARRVAL_P(expr), indent, 0);
|
2020-09-15 17:38:40 +08:00
|
|
|
GC_TRY_UNPROTECT_RECURSION(Z_ARRVAL_P(expr));
|
1999-04-08 02:10:10 +08:00
|
|
|
break;
|
|
|
|
case IS_OBJECT:
|
2001-07-29 16:22:57 +08:00
|
|
|
{
|
2007-10-11 09:03:19 +08:00
|
|
|
HashTable *properties;
|
|
|
|
|
2020-06-11 05:10:18 +08:00
|
|
|
zend_object *zobj = Z_OBJ_P(expr);
|
2023-08-24 19:58:13 +08:00
|
|
|
uint32_t *guard = zend_get_recursion_guard(zobj);
|
2020-06-11 05:10:18 +08:00
|
|
|
zend_string *class_name = Z_OBJ_HANDLER_P(expr, get_class_name)(zobj);
|
2015-10-07 17:35:43 +08:00
|
|
|
smart_str_appends(buf, ZSTR_VAL(class_name));
|
2018-05-28 21:27:12 +08:00
|
|
|
zend_string_release_ex(class_name, 0);
|
2014-10-10 01:15:07 +08:00
|
|
|
|
2020-06-11 05:10:18 +08:00
|
|
|
if (!(zobj->ce->ce_flags & ZEND_ACC_ENUM)) {
|
|
|
|
smart_str_appends(buf, " Object\n");
|
|
|
|
} else {
|
|
|
|
smart_str_appends(buf, " Enum");
|
|
|
|
if (zobj->ce->enum_backing_type != IS_UNDEF) {
|
|
|
|
smart_str_appendc(buf, ':');
|
|
|
|
smart_str_appends(buf, zend_get_type_by_const(zobj->ce->enum_backing_type));
|
|
|
|
}
|
|
|
|
smart_str_appendc(buf, '\n');
|
|
|
|
}
|
2021-04-19 20:25:36 +08:00
|
|
|
|
2023-08-24 19:58:13 +08:00
|
|
|
if (ZEND_GUARD_OR_GC_IS_RECURSIVE(guard, DEBUG, zobj)) {
|
2015-10-07 17:35:43 +08:00
|
|
|
smart_str_appends(buf, " *RECURSION*");
|
2007-10-11 09:03:19 +08:00
|
|
|
return;
|
|
|
|
}
|
2018-10-04 19:58:35 +08:00
|
|
|
|
|
|
|
if ((properties = zend_get_properties_for(expr, ZEND_PROP_PURPOSE_DEBUG)) == NULL) {
|
2022-10-24 20:33:25 +08:00
|
|
|
print_hash(buf, (HashTable*) &zend_empty_array, indent, 1);
|
2015-04-16 03:07:34 +08:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2023-08-24 19:58:13 +08:00
|
|
|
ZEND_GUARD_OR_GC_PROTECT_RECURSION(guard, DEBUG, zobj);
|
2015-10-07 17:35:43 +08:00
|
|
|
print_hash(buf, properties, indent, 1);
|
2023-08-24 19:58:13 +08:00
|
|
|
ZEND_GUARD_OR_GC_UNPROTECT_RECURSION(guard, DEBUG, zobj);
|
2015-04-16 03:07:34 +08:00
|
|
|
|
2018-10-04 19:58:35 +08:00
|
|
|
zend_release_properties(properties);
|
2001-07-29 16:22:57 +08:00
|
|
|
break;
|
2000-11-03 07:17:55 +08:00
|
|
|
}
|
2015-10-07 17:35:43 +08:00
|
|
|
case IS_LONG:
|
|
|
|
smart_str_append_long(buf, Z_LVAL_P(expr));
|
|
|
|
break;
|
2016-07-12 05:28:14 +08:00
|
|
|
case IS_REFERENCE:
|
|
|
|
zend_print_zval_r_to_buf(buf, Z_REFVAL_P(expr), indent);
|
|
|
|
break;
|
2017-11-16 22:09:32 +08:00
|
|
|
case IS_STRING:
|
|
|
|
smart_str_append(buf, Z_STR_P(expr));
|
|
|
|
break;
|
1999-04-08 02:10:10 +08:00
|
|
|
default:
|
2015-10-07 17:35:43 +08:00
|
|
|
{
|
2017-11-16 22:09:32 +08:00
|
|
|
zend_string *str = zval_get_string_func(expr);
|
2015-10-07 17:35:43 +08:00
|
|
|
smart_str_append(buf, str);
|
2018-05-28 21:27:12 +08:00
|
|
|
zend_string_release_ex(str, 0);
|
2015-10-07 17:35:43 +08:00
|
|
|
}
|
1999-04-08 02:10:10 +08:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2007-11-03 03:40:39 +08:00
|
|
|
/* }}} */
|
1999-04-08 02:10:10 +08:00
|
|
|
|
2015-10-07 17:35:43 +08:00
|
|
|
ZEND_API zend_string *zend_print_zval_r_to_str(zval *expr, int indent) /* {{{ */
|
|
|
|
{
|
|
|
|
smart_str buf = {0};
|
|
|
|
zend_print_zval_r_to_buf(&buf, expr, indent);
|
|
|
|
smart_str_0(&buf);
|
|
|
|
return buf.s;
|
|
|
|
}
|
|
|
|
/* }}} */
|
|
|
|
|
|
|
|
ZEND_API void zend_print_zval_r(zval *expr, int indent) /* {{{ */
|
|
|
|
{
|
|
|
|
zend_string *str = zend_print_zval_r_to_str(expr, indent);
|
|
|
|
zend_write(ZSTR_VAL(str), ZSTR_LEN(str));
|
2018-05-28 21:27:12 +08:00
|
|
|
zend_string_release_ex(str, 0);
|
2015-10-07 17:35:43 +08:00
|
|
|
}
|
|
|
|
/* }}} */
|
|
|
|
|
2021-03-17 01:31:36 +08:00
|
|
|
static FILE *zend_fopen_wrapper(zend_string *filename, zend_string **opened_path) /* {{{ */
|
1999-04-08 02:10:10 +08:00
|
|
|
{
|
1999-12-01 04:15:04 +08:00
|
|
|
if (opened_path) {
|
2021-03-17 01:31:36 +08:00
|
|
|
*opened_path = zend_string_copy(filename);
|
1999-12-01 04:15:04 +08:00
|
|
|
}
|
2021-03-17 01:31:36 +08:00
|
|
|
return fopen(ZSTR_VAL(filename), "rb");
|
1999-04-08 02:10:10 +08:00
|
|
|
}
|
2007-11-03 03:40:39 +08:00
|
|
|
/* }}} */
|
1999-04-08 02:10:10 +08:00
|
|
|
|
2007-01-12 22:37:46 +08:00
|
|
|
#ifdef ZTS
|
2021-01-15 19:30:54 +08:00
|
|
|
static bool short_tags_default = 1;
|
2014-08-26 01:28:33 +08:00
|
|
|
static uint32_t compiler_options_default = ZEND_COMPILE_DEFAULT;
|
2007-01-12 22:37:46 +08:00
|
|
|
#else
|
2008-03-18 16:36:30 +08:00
|
|
|
# define short_tags_default 1
|
|
|
|
# define compiler_options_default ZEND_COMPILE_DEFAULT
|
2007-01-12 22:37:46 +08:00
|
|
|
#endif
|
|
|
|
|
2014-12-14 06:06:14 +08:00
|
|
|
static void zend_set_default_compile_time_values(void) /* {{{ */
|
2000-06-16 03:18:57 +08:00
|
|
|
{
|
|
|
|
/* default compile-time values */
|
2007-01-12 22:37:46 +08:00
|
|
|
CG(short_tags) = short_tags_default;
|
2008-03-18 16:36:30 +08:00
|
|
|
CG(compiler_options) = compiler_options_default;
|
2019-12-12 00:11:30 +08:00
|
|
|
|
|
|
|
CG(rtd_key_counter) = 0;
|
2000-06-16 03:18:57 +08:00
|
|
|
}
|
2007-11-03 03:40:39 +08:00
|
|
|
/* }}} */
|
2000-06-16 03:18:57 +08:00
|
|
|
|
2015-04-06 04:45:58 +08:00
|
|
|
#ifdef ZEND_WIN32
|
2015-04-06 01:45:04 +08:00
|
|
|
static void zend_get_windows_version_info(OSVERSIONINFOEX *osvi) /* {{{ */
|
|
|
|
{
|
|
|
|
ZeroMemory(osvi, sizeof(OSVERSIONINFOEX));
|
|
|
|
osvi->dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
|
|
|
|
if(!GetVersionEx((OSVERSIONINFO *) osvi)) {
|
2020-06-16 22:29:05 +08:00
|
|
|
ZEND_UNREACHABLE(); /* Should not happen as sizeof is used. */
|
2015-04-06 01:45:04 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
/* }}} */
|
2015-04-06 04:45:58 +08:00
|
|
|
#endif
|
2015-04-06 01:45:04 +08:00
|
|
|
|
2014-12-14 06:06:14 +08:00
|
|
|
static void zend_init_exception_op(void) /* {{{ */
|
2008-04-17 18:21:38 +08:00
|
|
|
{
|
|
|
|
memset(EG(exception_op), 0, sizeof(EG(exception_op)));
|
|
|
|
EG(exception_op)[0].opcode = ZEND_HANDLE_EXCEPTION;
|
|
|
|
ZEND_VM_SET_OPCODE_HANDLER(EG(exception_op));
|
|
|
|
EG(exception_op)[1].opcode = ZEND_HANDLE_EXCEPTION;
|
|
|
|
ZEND_VM_SET_OPCODE_HANDLER(EG(exception_op)+1);
|
|
|
|
EG(exception_op)[2].opcode = ZEND_HANDLE_EXCEPTION;
|
|
|
|
ZEND_VM_SET_OPCODE_HANDLER(EG(exception_op)+2);
|
|
|
|
}
|
|
|
|
/* }}} */
|
|
|
|
|
2015-04-11 04:01:00 +08:00
|
|
|
static void zend_init_call_trampoline_op(void) /* {{{ */
|
|
|
|
{
|
|
|
|
memset(&EG(call_trampoline_op), 0, sizeof(EG(call_trampoline_op)));
|
|
|
|
EG(call_trampoline_op).opcode = ZEND_CALL_TRAMPOLINE;
|
|
|
|
ZEND_VM_SET_OPCODE_HANDLER(&EG(call_trampoline_op));
|
|
|
|
}
|
|
|
|
/* }}} */
|
|
|
|
|
2015-09-18 17:27:39 +08:00
|
|
|
static void auto_global_dtor(zval *zv) /* {{{ */
|
|
|
|
{
|
2015-12-21 19:09:24 +08:00
|
|
|
free(Z_PTR_P(zv));
|
2015-09-18 17:27:39 +08:00
|
|
|
}
|
|
|
|
/* }}} */
|
|
|
|
|
1999-04-21 11:49:09 +08:00
|
|
|
#ifdef ZTS
|
2015-09-18 17:27:39 +08:00
|
|
|
static void auto_global_copy_ctor(zval *zv) /* {{{ */
|
2015-07-31 19:22:24 +08:00
|
|
|
{
|
|
|
|
zend_auto_global *old_ag = (zend_auto_global *) Z_PTR_P(zv);
|
|
|
|
zend_auto_global *new_ag = pemalloc(sizeof(zend_auto_global), 1);
|
|
|
|
|
2015-12-21 19:09:24 +08:00
|
|
|
new_ag->name = old_ag->name;
|
2015-07-31 19:22:24 +08:00
|
|
|
new_ag->auto_global_callback = old_ag->auto_global_callback;
|
|
|
|
new_ag->jit = old_ag->jit;
|
|
|
|
|
|
|
|
Z_PTR_P(zv) = new_ag;
|
|
|
|
}
|
2015-09-18 17:27:39 +08:00
|
|
|
/* }}} */
|
2015-07-31 19:22:24 +08:00
|
|
|
|
2014-12-14 06:06:14 +08:00
|
|
|
static void compiler_globals_ctor(zend_compiler_globals *compiler_globals) /* {{{ */
|
1999-04-21 11:49:09 +08:00
|
|
|
{
|
2000-07-13 00:37:46 +08:00
|
|
|
compiler_globals->compiled_filename = NULL;
|
2024-09-09 23:23:26 +08:00
|
|
|
compiler_globals->zend_lineno = 0;
|
2000-07-13 00:37:46 +08:00
|
|
|
|
2003-06-02 20:13:11 +08:00
|
|
|
compiler_globals->function_table = (HashTable *) malloc(sizeof(HashTable));
|
2020-08-26 18:57:24 +08:00
|
|
|
zend_hash_init(compiler_globals->function_table, 1024, NULL, ZEND_FUNCTION_DTOR, 1);
|
2023-02-13 15:09:30 +08:00
|
|
|
zend_hash_copy(compiler_globals->function_table, global_function_table, NULL);
|
|
|
|
compiler_globals->copied_functions_count = zend_hash_num_elements(compiler_globals->function_table);
|
1999-04-21 11:49:09 +08:00
|
|
|
|
2007-11-03 03:40:39 +08:00
|
|
|
compiler_globals->class_table = (HashTable *) malloc(sizeof(HashTable));
|
2020-08-26 18:57:24 +08:00
|
|
|
zend_hash_init(compiler_globals->class_table, 64, NULL, ZEND_CLASS_DTOR, 1);
|
2014-02-17 21:59:18 +08:00
|
|
|
zend_hash_copy(compiler_globals->class_table, global_class_table, zend_class_add_ref);
|
1999-12-27 19:22:57 +08:00
|
|
|
|
2014-12-14 06:06:14 +08:00
|
|
|
zend_set_default_compile_time_values();
|
2001-07-15 22:08:58 +08:00
|
|
|
|
2001-08-09 01:18:16 +08:00
|
|
|
compiler_globals->auto_globals = (HashTable *) malloc(sizeof(HashTable));
|
2020-08-26 18:57:24 +08:00
|
|
|
zend_hash_init(compiler_globals->auto_globals, 8, NULL, auto_global_dtor, 1);
|
2015-07-31 19:22:24 +08:00
|
|
|
zend_hash_copy(compiler_globals->auto_globals, global_auto_globals_table, auto_global_copy_ctor);
|
2005-12-01 19:48:17 +08:00
|
|
|
|
2010-12-28 04:25:34 +08:00
|
|
|
compiler_globals->script_encoding_list = NULL;
|
Added Inheritance Cache.
This is a new transparent technology that eliminates overhead of PHP class inheritance.
PHP classes are compiled and cached (by opcahce) separately, however their "linking" was done at run-time - on each request. The process of "linking" may involve a number of compatibility checks and borrowing methods/properties/constants form parent and traits. This takes significant time, but the result is the same on each request.
Inheritance Cache performs "linking" for unique set of all the depending classes (parent, interfaces, traits, property types, method types involved into compatibility checks) once and stores result in opcache shared memory. As a part of the this patch, I removed limitations for immutable classes (unresolved constants, typed properties and covariant type checks). So now all classes stored in opcache are "immutable". They may be lazily loaded into process memory, if necessary, but this usually occurs just once (on first linking).
The patch shows 8% improvement on Symphony "Hello World" app.
2021-02-10 03:53:57 +08:00
|
|
|
compiler_globals->current_linking_class = NULL;
|
2018-10-17 20:52:50 +08:00
|
|
|
|
|
|
|
/* Map region is going to be created and resized at run-time. */
|
2021-08-26 18:27:25 +08:00
|
|
|
compiler_globals->map_ptr_real_base = NULL;
|
|
|
|
compiler_globals->map_ptr_base = ZEND_MAP_PTR_BIASED_BASE(NULL);
|
2018-10-17 20:52:50 +08:00
|
|
|
compiler_globals->map_ptr_size = 0;
|
|
|
|
compiler_globals->map_ptr_last = global_map_ptr_last;
|
2024-09-07 07:45:26 +08:00
|
|
|
compiler_globals->internal_run_time_cache = NULL;
|
|
|
|
if (compiler_globals->map_ptr_last || zend_map_ptr_static_size) {
|
2018-10-17 20:52:50 +08:00
|
|
|
/* Allocate map_ptr table */
|
|
|
|
compiler_globals->map_ptr_size = ZEND_MM_ALIGNED_SIZE_EX(compiler_globals->map_ptr_last, 4096);
|
2024-09-07 07:45:26 +08:00
|
|
|
void *base = pemalloc((zend_map_ptr_static_size + compiler_globals->map_ptr_size) * sizeof(void*), 1);
|
2021-08-26 18:27:25 +08:00
|
|
|
compiler_globals->map_ptr_real_base = base;
|
|
|
|
compiler_globals->map_ptr_base = ZEND_MAP_PTR_BIASED_BASE(base);
|
2024-09-07 07:45:26 +08:00
|
|
|
memset(base, 0, (zend_map_ptr_static_size + compiler_globals->map_ptr_last) * sizeof(void*));
|
2018-10-17 20:52:50 +08:00
|
|
|
}
|
2024-09-07 07:45:26 +08:00
|
|
|
zend_init_internal_run_time_cache();
|
1999-04-21 11:49:09 +08:00
|
|
|
}
|
2007-11-03 03:40:39 +08:00
|
|
|
/* }}} */
|
1999-04-21 11:49:09 +08:00
|
|
|
|
2014-12-14 06:06:14 +08:00
|
|
|
static void compiler_globals_dtor(zend_compiler_globals *compiler_globals) /* {{{ */
|
1999-04-21 11:49:09 +08:00
|
|
|
{
|
2001-12-13 04:45:38 +08:00
|
|
|
if (compiler_globals->function_table != GLOBAL_FUNCTION_TABLE) {
|
2023-02-13 15:09:30 +08:00
|
|
|
uint32_t n = compiler_globals->copied_functions_count;
|
|
|
|
|
|
|
|
/* Prevent destruction of functions copied from the main process context */
|
|
|
|
if (zend_hash_num_elements(compiler_globals->function_table) <= n) {
|
|
|
|
compiler_globals->function_table->nNumUsed = 0;
|
|
|
|
} else {
|
|
|
|
Bucket *p = compiler_globals->function_table->arData;
|
|
|
|
|
|
|
|
compiler_globals->function_table->nNumOfElements -= n;
|
|
|
|
while (n != 0) {
|
|
|
|
ZVAL_UNDEF(&p->val);
|
|
|
|
p++;
|
|
|
|
n--;
|
|
|
|
}
|
|
|
|
}
|
1999-05-11 04:46:42 +08:00
|
|
|
zend_hash_destroy(compiler_globals->function_table);
|
2003-12-12 18:50:23 +08:00
|
|
|
free(compiler_globals->function_table);
|
1999-05-11 04:46:42 +08:00
|
|
|
}
|
2001-12-13 04:45:38 +08:00
|
|
|
if (compiler_globals->class_table != GLOBAL_CLASS_TABLE) {
|
2021-04-30 15:58:14 +08:00
|
|
|
/* Child classes may reuse structures from parent classes, so destroy in reverse order. */
|
|
|
|
zend_hash_graceful_reverse_destroy(compiler_globals->class_table);
|
2003-12-12 18:50:23 +08:00
|
|
|
free(compiler_globals->class_table);
|
1999-05-11 04:46:42 +08:00
|
|
|
}
|
2003-12-12 18:50:23 +08:00
|
|
|
if (compiler_globals->auto_globals != GLOBAL_AUTO_GLOBALS_TABLE) {
|
2001-08-09 01:18:16 +08:00
|
|
|
zend_hash_destroy(compiler_globals->auto_globals);
|
|
|
|
free(compiler_globals->auto_globals);
|
|
|
|
}
|
2010-12-20 00:36:37 +08:00
|
|
|
if (compiler_globals->script_encoding_list) {
|
2014-08-15 03:53:27 +08:00
|
|
|
pefree((char*)compiler_globals->script_encoding_list, 1);
|
2010-12-20 00:36:37 +08:00
|
|
|
}
|
2021-08-26 18:27:25 +08:00
|
|
|
if (compiler_globals->map_ptr_real_base) {
|
|
|
|
free(compiler_globals->map_ptr_real_base);
|
|
|
|
compiler_globals->map_ptr_real_base = NULL;
|
|
|
|
compiler_globals->map_ptr_base = ZEND_MAP_PTR_BIASED_BASE(NULL);
|
2018-10-17 20:52:50 +08:00
|
|
|
compiler_globals->map_ptr_size = 0;
|
|
|
|
}
|
2024-09-07 07:45:26 +08:00
|
|
|
if (compiler_globals->internal_run_time_cache) {
|
|
|
|
pefree(compiler_globals->internal_run_time_cache, 1);
|
|
|
|
compiler_globals->internal_run_time_cache = NULL;
|
|
|
|
}
|
1999-04-21 11:49:09 +08:00
|
|
|
}
|
2007-11-03 03:40:39 +08:00
|
|
|
/* }}} */
|
1999-04-22 01:26:37 +08:00
|
|
|
|
2014-12-14 06:06:14 +08:00
|
|
|
static void executor_globals_ctor(zend_executor_globals *executor_globals) /* {{{ */
|
1999-04-22 01:26:37 +08:00
|
|
|
{
|
2014-12-14 06:06:14 +08:00
|
|
|
zend_startup_constants();
|
2017-02-21 19:12:42 +08:00
|
|
|
zend_copy_constants(executor_globals->zend_constants, GLOBAL_CONSTANTS_TABLE);
|
2014-12-14 06:06:14 +08:00
|
|
|
zend_init_rsrc_plist();
|
|
|
|
zend_init_exception_op();
|
2015-04-11 04:01:00 +08:00
|
|
|
zend_init_call_trampoline_op();
|
|
|
|
memset(&executor_globals->trampoline, 0, sizeof(zend_op_array));
|
2021-02-11 21:23:01 +08:00
|
|
|
executor_globals->capture_warnings_during_sccp = 0;
|
2024-09-09 23:13:43 +08:00
|
|
|
executor_globals->user_error_handler_error_reporting = 0;
|
2015-02-21 11:35:16 +08:00
|
|
|
ZVAL_UNDEF(&executor_globals->user_error_handler);
|
|
|
|
ZVAL_UNDEF(&executor_globals->user_exception_handler);
|
|
|
|
executor_globals->in_autoload = NULL;
|
|
|
|
executor_globals->current_execute_data = NULL;
|
|
|
|
executor_globals->current_module = NULL;
|
|
|
|
executor_globals->exit_status = 0;
|
2015-02-13 18:25:44 +08:00
|
|
|
#if XPFPA_HAVE_CW
|
2015-02-21 11:35:16 +08:00
|
|
|
executor_globals->saved_fpu_cw = 0;
|
2015-02-13 18:25:44 +08:00
|
|
|
#endif
|
2015-02-21 11:35:16 +08:00
|
|
|
executor_globals->saved_fpu_cw_ptr = NULL;
|
|
|
|
executor_globals->active = 0;
|
|
|
|
executor_globals->bailout = NULL;
|
|
|
|
executor_globals->error_handling = EH_NORMAL;
|
|
|
|
executor_globals->exception_class = NULL;
|
|
|
|
executor_globals->exception = NULL;
|
|
|
|
executor_globals->objects_store.object_buckets = NULL;
|
2021-06-11 12:00:07 +08:00
|
|
|
executor_globals->current_fiber_context = NULL;
|
|
|
|
executor_globals->main_fiber_context = NULL;
|
|
|
|
executor_globals->active_fiber = NULL;
|
2015-04-05 02:28:58 +08:00
|
|
|
#ifdef ZEND_WIN32
|
2015-04-06 01:45:04 +08:00
|
|
|
zend_get_windows_version_info(&executor_globals->windows_version_info);
|
2015-04-05 02:28:58 +08:00
|
|
|
#endif
|
2017-02-10 01:40:33 +08:00
|
|
|
executor_globals->flags = EG_FLAGS_INITIAL;
|
2021-04-29 22:37:53 +08:00
|
|
|
executor_globals->record_errors = false;
|
|
|
|
executor_globals->num_errors = 0;
|
|
|
|
executor_globals->errors = NULL;
|
2024-11-01 05:56:42 +08:00
|
|
|
executor_globals->filename_override = NULL;
|
|
|
|
executor_globals->lineno_override = -1;
|
2022-12-17 00:44:26 +08:00
|
|
|
#ifdef ZEND_CHECK_STACK_LIMIT
|
|
|
|
executor_globals->stack_limit = (void*)0;
|
|
|
|
executor_globals->stack_base = (void*)0;
|
|
|
|
#endif
|
2023-03-03 18:35:06 +08:00
|
|
|
#ifdef ZEND_MAX_EXECUTION_TIMERS
|
|
|
|
executor_globals->pid = 0;
|
|
|
|
executor_globals->oldact = (struct sigaction){0};
|
|
|
|
#endif
|
2024-04-23 17:52:38 +08:00
|
|
|
memset(executor_globals->strtod_state.freelist, 0,
|
|
|
|
sizeof(executor_globals->strtod_state.freelist));
|
|
|
|
executor_globals->strtod_state.p5s = NULL;
|
|
|
|
executor_globals->strtod_state.result = NULL;
|
1999-04-22 01:26:37 +08:00
|
|
|
}
|
2007-11-03 03:40:39 +08:00
|
|
|
/* }}} */
|
1999-04-22 01:26:37 +08:00
|
|
|
|
Fix ZTS crashes with persistent resources in modules (#13381)
On shutdown in ZTS the following happens:
- https://github.com/php/php-src/blob/master/Zend/zend.c#L1124-L1125
gets executed. This destroys global persistent resources and destroys
the modules. Furthermore, the modules are unloaded too.
- Further down, `ts_free_id(executor_globals_id)` gets executed, which
calls `executor_globals_dtor`. This function destroys persistent
resources for each thread.
Notice that in the last step, the modules that the persistent resource
belong to may already have been destroyed. This means that accessing
globals will cause a crash (I previously fixed this with ifdef magic),
or when the module is dynamically loaded we'll try jumping to a
destructor that is no longer loaded in memory. These scenarios cause
crashes.
It's not possible to move the `ts_free_id` call upwards, because that
may break assumptions of callers, and furthermore this would deallocate
the executor globals structure, which means that any access to those
will cause a segfault.
This patch adds a new API to the TSRM that allows running a callback on
a certain resource type. We use this API to destroy the persistent
resources in all threads prior to the module destruction, and keep the
rest of the resource dtor intact.
I verified this fix on Apache with postgres, both dynamically and
statically.
Fixes GH-12974.
2024-02-14 04:43:03 +08:00
|
|
|
static void executor_globals_persistent_list_dtor(void *storage)
|
1999-04-22 01:26:37 +08:00
|
|
|
{
|
Fix ZTS crashes with persistent resources in modules (#13381)
On shutdown in ZTS the following happens:
- https://github.com/php/php-src/blob/master/Zend/zend.c#L1124-L1125
gets executed. This destroys global persistent resources and destroys
the modules. Furthermore, the modules are unloaded too.
- Further down, `ts_free_id(executor_globals_id)` gets executed, which
calls `executor_globals_dtor`. This function destroys persistent
resources for each thread.
Notice that in the last step, the modules that the persistent resource
belong to may already have been destroyed. This means that accessing
globals will cause a crash (I previously fixed this with ifdef magic),
or when the module is dynamically loaded we'll try jumping to a
destructor that is no longer loaded in memory. These scenarios cause
crashes.
It's not possible to move the `ts_free_id` call upwards, because that
may break assumptions of callers, and furthermore this would deallocate
the executor globals structure, which means that any access to those
will cause a segfault.
This patch adds a new API to the TSRM that allows running a callback on
a certain resource type. We use this API to destroy the persistent
resources in all threads prior to the module destruction, and keep the
rest of the resource dtor intact.
I verified this fix on Apache with postgres, both dynamically and
statically.
Fixes GH-12974.
2024-02-14 04:43:03 +08:00
|
|
|
zend_executor_globals *executor_globals = storage;
|
2015-07-31 19:43:17 +08:00
|
|
|
|
2005-09-12 17:06:15 +08:00
|
|
|
if (&executor_globals->persistent_list != global_persistent_list) {
|
2014-12-14 06:06:14 +08:00
|
|
|
zend_destroy_rsrc_list(&executor_globals->persistent_list);
|
2005-09-12 17:06:15 +08:00
|
|
|
}
|
Fix ZTS crashes with persistent resources in modules (#13381)
On shutdown in ZTS the following happens:
- https://github.com/php/php-src/blob/master/Zend/zend.c#L1124-L1125
gets executed. This destroys global persistent resources and destroys
the modules. Furthermore, the modules are unloaded too.
- Further down, `ts_free_id(executor_globals_id)` gets executed, which
calls `executor_globals_dtor`. This function destroys persistent
resources for each thread.
Notice that in the last step, the modules that the persistent resource
belong to may already have been destroyed. This means that accessing
globals will cause a crash (I previously fixed this with ifdef magic),
or when the module is dynamically loaded we'll try jumping to a
destructor that is no longer loaded in memory. These scenarios cause
crashes.
It's not possible to move the `ts_free_id` call upwards, because that
may break assumptions of callers, and furthermore this would deallocate
the executor globals structure, which means that any access to those
will cause a segfault.
This patch adds a new API to the TSRM that allows running a callback on
a certain resource type. We use this API to destroy the persistent
resources in all threads prior to the module destruction, and keep the
rest of the resource dtor intact.
I verified this fix on Apache with postgres, both dynamically and
statically.
Fixes GH-12974.
2024-02-14 04:43:03 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void executor_globals_dtor(zend_executor_globals *executor_globals) /* {{{ */
|
|
|
|
{
|
|
|
|
zend_ini_dtor(executor_globals->ini_directives);
|
|
|
|
|
2005-09-12 17:06:15 +08:00
|
|
|
if (executor_globals->zend_constants != GLOBAL_CONSTANTS_TABLE) {
|
|
|
|
zend_hash_destroy(executor_globals->zend_constants);
|
|
|
|
free(executor_globals->zend_constants);
|
|
|
|
}
|
1999-04-22 01:26:37 +08:00
|
|
|
}
|
2007-11-03 03:40:39 +08:00
|
|
|
/* }}} */
|
1999-04-22 01:26:37 +08:00
|
|
|
|
2014-12-14 06:06:14 +08:00
|
|
|
static void zend_new_thread_end_handler(THREAD_T thread_id) /* {{{ */
|
2001-08-06 21:48:51 +08:00
|
|
|
{
|
2020-08-28 21:41:27 +08:00
|
|
|
zend_copy_ini_directives();
|
|
|
|
zend_ini_refresh_caches(ZEND_INI_STAGE_STARTUP);
|
2022-12-17 00:44:26 +08:00
|
|
|
#ifdef ZEND_CHECK_STACK_LIMIT
|
|
|
|
zend_call_stack_init();
|
|
|
|
#endif
|
2023-03-03 18:35:06 +08:00
|
|
|
zend_max_execution_timer_init();
|
2001-08-06 21:48:51 +08:00
|
|
|
}
|
2007-11-03 03:40:39 +08:00
|
|
|
/* }}} */
|
2001-08-03 15:06:05 +08:00
|
|
|
#endif
|
|
|
|
|
2004-07-11 03:29:01 +08:00
|
|
|
#if defined(__FreeBSD__) || defined(__DragonFly__)
|
|
|
|
/* FreeBSD and DragonFly floating point precision fix */
|
2000-06-12 01:45:19 +08:00
|
|
|
#include <floatingpoint.h>
|
|
|
|
#endif
|
1999-04-21 11:49:09 +08:00
|
|
|
|
2014-12-14 06:06:14 +08:00
|
|
|
static void ini_scanner_globals_ctor(zend_ini_scanner_globals *scanner_globals_p) /* {{{ */
|
2008-03-17 05:06:55 +08:00
|
|
|
{
|
|
|
|
memset(scanner_globals_p, 0, sizeof(*scanner_globals_p));
|
|
|
|
}
|
|
|
|
/* }}} */
|
|
|
|
|
2014-12-14 06:06:14 +08:00
|
|
|
static void php_scanner_globals_ctor(zend_php_scanner_globals *scanner_globals_p) /* {{{ */
|
2000-12-27 23:43:15 +08:00
|
|
|
{
|
2008-03-17 05:06:55 +08:00
|
|
|
memset(scanner_globals_p, 0, sizeof(*scanner_globals_p));
|
2000-12-27 23:43:15 +08:00
|
|
|
}
|
2007-11-03 03:40:39 +08:00
|
|
|
/* }}} */
|
2000-12-27 23:43:15 +08:00
|
|
|
|
2014-02-17 21:59:18 +08:00
|
|
|
static void module_destructor_zval(zval *zv) /* {{{ */
|
|
|
|
{
|
|
|
|
zend_module_entry *module = (zend_module_entry*)Z_PTR_P(zv);
|
|
|
|
module_destructor(module);
|
|
|
|
}
|
|
|
|
/* }}} */
|
|
|
|
|
2021-01-15 19:30:54 +08:00
|
|
|
static bool php_auto_globals_create_globals(zend_string *name) /* {{{ */
|
2010-07-08 22:05:11 +08:00
|
|
|
{
|
2020-12-03 00:47:33 +08:00
|
|
|
/* While we keep registering $GLOBALS as an auto-global, we do not create an
|
|
|
|
* actual variable for it. Access to it handled specially by the compiler. */
|
2010-07-08 22:05:11 +08:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
/* }}} */
|
|
|
|
|
2020-08-28 21:41:27 +08:00
|
|
|
void zend_startup(zend_utility_functions *utility_functions) /* {{{ */
|
1999-04-08 02:10:10 +08:00
|
|
|
{
|
1999-04-22 01:26:37 +08:00
|
|
|
#ifdef ZTS
|
1999-04-26 22:10:42 +08:00
|
|
|
zend_compiler_globals *compiler_globals;
|
1999-04-22 01:26:37 +08:00
|
|
|
zend_executor_globals *executor_globals;
|
reworked the patch, less new stuff but worky
TLS is already used in TSRM, the way exporting the tsrm cache through
a thread local variable is not portable. Additionally, the current
patch suffers from bugs which are hard to find, but prevent it to
be worky with apache. What is done here is mainly uses the idea
from the RFC patch, but
- __thread variable is removed
- offset math and declarations are removed
- extra macros and definitions are removed
What is done merely is
- use an inline function to access the tsrm cache. The function uses
the portable tsrm_tls_get macro which is cheap
- all the TSRM_* macros are set to placebo. Thus this opens the way
remove them later
Except that, the logic is old. TSRMLS_FETCH will have to be done once
per thread, then tsrm_get_ls_cache() can be used. Things seeming to be
worky are cli, cli server and apache. I also tried to enable bz2
shared and it has worked out of the box. The change is yet minimal
diffing to the current master bus is a worky start, IMHO. Though will
have to recheck the other previously done SAPIs - embed and cgi.
The offsets can be added to the tsrm_resource_type struct, then
it'll not be needed to declare them in the userspace. Even the
"done" member type can be changed to int16 or smaller, then adding
the offset as int16 will not change the struct size. As well on the
todo might be removing the hashed storage, thread_id != thread_id and
linked list logic in favour of the explicit TLS operations.
2014-09-26 00:48:27 +08:00
|
|
|
extern ZEND_API ts_rsrc_id ini_scanner_globals_id;
|
|
|
|
extern ZEND_API ts_rsrc_id language_scanner_globals_id;
|
2001-08-06 21:48:51 +08:00
|
|
|
#else
|
2008-03-17 05:06:55 +08:00
|
|
|
extern zend_ini_scanner_globals ini_scanner_globals;
|
|
|
|
extern zend_php_scanner_globals language_scanner_globals;
|
2001-08-06 21:48:51 +08:00
|
|
|
#endif
|
1999-04-22 01:26:37 +08:00
|
|
|
|
2018-01-16 18:27:18 +08:00
|
|
|
zend_cpu_startup();
|
|
|
|
|
2017-08-14 06:44:19 +08:00
|
|
|
#ifdef ZEND_WIN32
|
|
|
|
php_win32_cp_set_by_id(65001);
|
|
|
|
#endif
|
|
|
|
|
2024-06-12 20:02:48 +08:00
|
|
|
/* Set up early utility functions. zend_mm depends on
|
|
|
|
* zend_random_bytes_insecure */
|
2024-06-12 19:57:54 +08:00
|
|
|
zend_random_bytes = utility_functions->random_bytes_function;
|
|
|
|
zend_random_bytes_insecure = utility_functions->random_bytes_insecure_function;
|
|
|
|
|
2014-12-14 06:06:14 +08:00
|
|
|
start_memory_manager();
|
1999-04-22 01:26:37 +08:00
|
|
|
|
2013-10-17 16:40:43 +08:00
|
|
|
virtual_cwd_startup(); /* Could use shutdown to free the main cwd but it would just slow it down for CGI */
|
|
|
|
|
2004-07-11 03:29:01 +08:00
|
|
|
#if defined(__FreeBSD__) || defined(__DragonFly__)
|
|
|
|
/* FreeBSD and DragonFly floating point precision fix */
|
2000-12-23 05:11:34 +08:00
|
|
|
fpsetmask(0);
|
2000-06-12 01:45:19 +08:00
|
|
|
#endif
|
2000-09-26 02:10:45 +08:00
|
|
|
|
2023-07-16 18:34:28 +08:00
|
|
|
zend_startup_hrtime();
|
2000-09-26 02:10:45 +08:00
|
|
|
zend_startup_extensions_mechanism();
|
|
|
|
|
1999-04-08 02:10:10 +08:00
|
|
|
/* Set up utility functions and values */
|
2000-04-19 23:08:06 +08:00
|
|
|
zend_error_cb = utility_functions->error_function;
|
1999-04-08 02:10:10 +08:00
|
|
|
zend_printf = utility_functions->printf_function;
|
2020-04-15 16:45:18 +08:00
|
|
|
zend_write = utility_functions->write_function;
|
1999-04-08 02:10:10 +08:00
|
|
|
zend_fopen = utility_functions->fopen_function;
|
|
|
|
if (!zend_fopen) {
|
|
|
|
zend_fopen = zend_fopen_wrapper;
|
|
|
|
}
|
2003-02-18 17:37:54 +08:00
|
|
|
zend_stream_open_function = utility_functions->stream_open_function;
|
2000-03-06 03:50:10 +08:00
|
|
|
zend_message_dispatcher_p = utility_functions->message_handler;
|
2001-01-08 02:39:11 +08:00
|
|
|
zend_get_configuration_directive_p = utility_functions->get_configuration_directive;
|
2000-01-25 03:00:30 +08:00
|
|
|
zend_ticks_function = utility_functions->ticks_function;
|
2002-09-19 23:58:01 +08:00
|
|
|
zend_on_timeout = utility_functions->on_timeout;
|
2016-12-19 00:53:27 +08:00
|
|
|
zend_printf_to_smart_string = utility_functions->printf_to_smart_string_function;
|
|
|
|
zend_printf_to_smart_str = utility_functions->printf_to_smart_str_function;
|
2004-09-06 06:40:35 +08:00
|
|
|
zend_getenv = utility_functions->getenv_function;
|
2008-03-05 21:34:12 +08:00
|
|
|
zend_resolve_path = utility_functions->resolve_path_function;
|
1999-06-20 04:42:15 +08:00
|
|
|
|
2016-06-23 20:01:23 +08:00
|
|
|
zend_interrupt_function = NULL;
|
|
|
|
|
2020-05-12 23:52:53 +08:00
|
|
|
#ifdef HAVE_DTRACE
|
2016-11-18 17:52:46 +08:00
|
|
|
/* build with dtrace support */
|
2016-11-18 18:19:30 +08:00
|
|
|
{
|
|
|
|
char *tmp = getenv("USE_ZEND_DTRACE");
|
|
|
|
|
2021-07-12 22:56:00 +08:00
|
|
|
if (tmp && ZEND_ATOL(tmp)) {
|
2017-01-21 00:45:15 +08:00
|
|
|
zend_dtrace_enabled = 1;
|
2016-11-18 18:19:30 +08:00
|
|
|
zend_compile_file = dtrace_compile_file;
|
|
|
|
zend_execute_ex = dtrace_execute_ex;
|
|
|
|
zend_execute_internal = dtrace_execute_internal;
|
2020-04-27 14:20:56 +08:00
|
|
|
|
2020-09-14 20:05:54 +08:00
|
|
|
zend_observer_error_register(dtrace_error_notify_cb);
|
2016-11-18 18:19:30 +08:00
|
|
|
} else {
|
|
|
|
zend_compile_file = compile_file;
|
|
|
|
zend_execute_ex = execute_ex;
|
|
|
|
zend_execute_internal = NULL;
|
|
|
|
}
|
|
|
|
}
|
2016-11-18 17:52:46 +08:00
|
|
|
#else
|
2000-08-10 03:22:35 +08:00
|
|
|
zend_compile_file = compile_file;
|
2012-11-30 17:39:23 +08:00
|
|
|
zend_execute_ex = execute_ex;
|
2003-01-12 00:12:44 +08:00
|
|
|
zend_execute_internal = NULL;
|
2017-08-02 10:49:10 +08:00
|
|
|
#endif /* HAVE_DTRACE */
|
2010-04-24 21:32:30 +08:00
|
|
|
zend_compile_string = compile_string;
|
2004-04-13 23:19:21 +08:00
|
|
|
zend_throw_exception_hook = NULL;
|
1999-04-08 02:10:10 +08:00
|
|
|
|
2014-12-03 04:18:18 +08:00
|
|
|
/* Set up the default garbage collection implementation. */
|
|
|
|
gc_collect_cycles = zend_gc_collect_cycles;
|
|
|
|
|
2018-02-19 21:42:02 +08:00
|
|
|
zend_vm_init();
|
2002-10-19 05:19:27 +08:00
|
|
|
|
1999-04-08 02:10:10 +08:00
|
|
|
/* set up version */
|
|
|
|
zend_version_info = strdup(ZEND_CORE_VERSION_INFO);
|
2007-11-03 03:40:39 +08:00
|
|
|
zend_version_info_length = sizeof(ZEND_CORE_VERSION_INFO) - 1;
|
|
|
|
|
|
|
|
GLOBAL_FUNCTION_TABLE = (HashTable *) malloc(sizeof(HashTable));
|
|
|
|
GLOBAL_CLASS_TABLE = (HashTable *) malloc(sizeof(HashTable));
|
|
|
|
GLOBAL_AUTO_GLOBALS_TABLE = (HashTable *) malloc(sizeof(HashTable));
|
|
|
|
GLOBAL_CONSTANTS_TABLE = (HashTable *) malloc(sizeof(HashTable));
|
1999-04-08 02:10:10 +08:00
|
|
|
|
2020-08-26 18:57:24 +08:00
|
|
|
zend_hash_init(GLOBAL_FUNCTION_TABLE, 1024, NULL, ZEND_FUNCTION_DTOR, 1);
|
|
|
|
zend_hash_init(GLOBAL_CLASS_TABLE, 64, NULL, ZEND_CLASS_DTOR, 1);
|
|
|
|
zend_hash_init(GLOBAL_AUTO_GLOBALS_TABLE, 8, NULL, auto_global_dtor, 1);
|
|
|
|
zend_hash_init(GLOBAL_CONSTANTS_TABLE, 128, NULL, ZEND_CONSTANT_DTOR, 1);
|
2001-10-01 01:29:55 +08:00
|
|
|
|
2020-08-26 18:57:24 +08:00
|
|
|
zend_hash_init(&module_registry, 32, NULL, module_destructor_zval, 1);
|
2000-04-15 21:02:22 +08:00
|
|
|
zend_init_rsrc_list_dtors();
|
1999-04-08 02:10:10 +08:00
|
|
|
|
1999-04-21 11:49:09 +08:00
|
|
|
#ifdef ZTS
|
2019-03-14 08:01:01 +08:00
|
|
|
ts_allocate_fast_id(&compiler_globals_id, &compiler_globals_offset, sizeof(zend_compiler_globals), (ts_allocate_ctor) compiler_globals_ctor, (ts_allocate_dtor) compiler_globals_dtor);
|
|
|
|
ts_allocate_fast_id(&executor_globals_id, &executor_globals_offset, sizeof(zend_executor_globals), (ts_allocate_ctor) executor_globals_ctor, (ts_allocate_dtor) executor_globals_dtor);
|
|
|
|
ts_allocate_fast_id(&language_scanner_globals_id, &language_scanner_globals_offset, sizeof(zend_php_scanner_globals), (ts_allocate_ctor) php_scanner_globals_ctor, NULL);
|
|
|
|
ts_allocate_fast_id(&ini_scanner_globals_id, &ini_scanner_globals_offset, sizeof(zend_ini_scanner_globals), (ts_allocate_ctor) ini_scanner_globals_ctor, NULL);
|
1999-04-26 22:10:42 +08:00
|
|
|
compiler_globals = ts_resource(compiler_globals_id);
|
1999-04-22 01:26:37 +08:00
|
|
|
executor_globals = ts_resource(executor_globals_id);
|
2002-09-19 06:16:22 +08:00
|
|
|
|
2014-12-14 06:06:14 +08:00
|
|
|
compiler_globals_dtor(compiler_globals);
|
2004-02-12 06:58:03 +08:00
|
|
|
compiler_globals->in_compilation = 0;
|
2003-12-12 18:50:23 +08:00
|
|
|
compiler_globals->function_table = (HashTable *) malloc(sizeof(HashTable));
|
|
|
|
compiler_globals->class_table = (HashTable *) malloc(sizeof(HashTable));
|
|
|
|
|
2001-12-14 00:55:04 +08:00
|
|
|
*compiler_globals->function_table = *GLOBAL_FUNCTION_TABLE;
|
|
|
|
*compiler_globals->class_table = *GLOBAL_CLASS_TABLE;
|
2001-08-09 01:18:16 +08:00
|
|
|
compiler_globals->auto_globals = GLOBAL_AUTO_GLOBALS_TABLE;
|
2002-09-19 06:16:22 +08:00
|
|
|
|
|
|
|
zend_hash_destroy(executor_globals->zend_constants);
|
|
|
|
*executor_globals->zend_constants = *GLOBAL_CONSTANTS_TABLE;
|
1999-07-15 03:49:19 +08:00
|
|
|
#else
|
2014-12-14 06:06:14 +08:00
|
|
|
ini_scanner_globals_ctor(&ini_scanner_globals);
|
|
|
|
php_scanner_globals_ctor(&language_scanner_globals);
|
|
|
|
zend_set_default_compile_time_values();
|
2015-05-29 17:44:46 +08:00
|
|
|
#ifdef ZEND_WIN32
|
|
|
|
zend_get_windows_version_info(&EG(windows_version_info));
|
|
|
|
#endif
|
2021-10-14 17:16:18 +08:00
|
|
|
/* Map region is going to be created and resized at run-time. */
|
|
|
|
CG(map_ptr_real_base) = NULL;
|
|
|
|
CG(map_ptr_base) = ZEND_MAP_PTR_BIASED_BASE(NULL);
|
|
|
|
CG(map_ptr_size) = 0;
|
|
|
|
CG(map_ptr_last) = 0;
|
2022-12-17 00:44:26 +08:00
|
|
|
#endif /* ZTS */
|
2015-02-21 11:35:16 +08:00
|
|
|
EG(error_reporting) = E_ALL & ~E_NOTICE;
|
2008-12-31 04:15:28 +08:00
|
|
|
|
2014-12-14 06:06:14 +08:00
|
|
|
zend_interned_strings_init();
|
|
|
|
zend_startup_builtin_functions();
|
|
|
|
zend_register_standard_constants();
|
2017-11-29 22:10:51 +08:00
|
|
|
zend_register_auto_global(zend_string_init_interned("GLOBALS", sizeof("GLOBALS") - 1, 1), 1, php_auto_globals_create_globals);
|
1999-04-21 11:49:09 +08:00
|
|
|
|
1999-05-09 20:24:21 +08:00
|
|
|
#ifndef ZTS
|
2014-12-14 06:06:14 +08:00
|
|
|
zend_init_rsrc_plist();
|
|
|
|
zend_init_exception_op();
|
2015-04-11 04:01:00 +08:00
|
|
|
zend_init_call_trampoline_op();
|
1999-05-09 20:24:21 +08:00
|
|
|
#endif
|
1999-04-22 01:26:37 +08:00
|
|
|
|
2014-12-14 06:06:14 +08:00
|
|
|
zend_ini_startup();
|
2000-12-27 23:43:15 +08:00
|
|
|
|
Fixed the UTF-8 and long path support in the streams on Windows.
Since long the default PHP charset is UTF-8, however the Windows part is
out of step with this important point. The current implementation in PHP
doesn't technically permit to handle UTF-8 filepath and several other
things. Till now, only the ANSI compatible APIs are being used. Here is more
about it
https://msdn.microsoft.com/en-us/library/windows/desktop/dd317752%28v=vs.85%29.aspx
The patch fixes not only issues with multibyte filenames under
incompatible codepages, but indirectly also issues with some other multibyte
encodings like BIG5, Shift-JIS, etc. by providing a clean way to access
filenames in UTF-8. Below is a small list of issues from the bug tracker,
that are getting fixed:
https://bugs.php.net/63401
https://bugs.php.net/41199
https://bugs.php.net/50203
https://bugs.php.net/71509
https://bugs.php.net/64699
https://bugs.php.net/64506
https://bugs.php.net/30195
https://bugs.php.net/65358
https://bugs.php.net/61315
https://bugs.php.net/70943
https://bugs.php.net/70903
https://bugs.php.net/63593
https://bugs.php.net/54977
https://bugs.php.net/54028
https://bugs.php.net/43148
https://bugs.php.net/30730
https://bugs.php.net/33350
https://bugs.php.net/35300
https://bugs.php.net/46990
https://bugs.php.net/61309
https://bugs.php.net/69333
https://bugs.php.net/45517
https://bugs.php.net/70551
https://bugs.php.net/50197
https://bugs.php.net/72200
https://bugs.php.net/37672
Yet more related tickets can for sure be found - on bugs.php.net, Stackoverflow
and Github. Some of the bugs are pretty recent, some descend to early
2000th, but the user comments in there last even till today. Just for example,
bug #30195 was opened in 2004, the latest comment in there was made in 2014. It
is certain, that these bugs descend not only to pure PHP use cases, but get also
redirected from the popular PHP based projects. Given the modern systems (and
those supported by PHP) are always based on NTFS, there is no excuse to keep
these issues unresolved.
The internalization approach on Windows is in many ways different from
UNIX and Linux, while it supports and is based on Unicode. It depends on the
current system code page, APIs used and exact kind how the binary was compiled
The locale doesn't affect the way Unicode or ANSI API work. PHP in particular
is being compiled without _UNICODE defined and this is conditioned by the
way we handle strings. Here is more about it
https://msdn.microsoft.com/en-us/library/tsbaswba.aspx
However, with any system code page ANSI functions automatically convert
paths to UTF-16. Paths in some encodings incompatible with the
current system code page, won't work correctly with ANSI APIs. PHP
till now only uses the ANSI Windows APIs.
For example, on a system with the current code page 1252, the paths
in cp1252 are supported and transparently converted to UTF-16 by the
ANSI functions. Once one wants to handle a filepath encoded with cp932 on
that particular system, an ANSI or a POSIX compatible function used in
PHP will produce an erroneous result. When trying to convert that cp932 path
to UTF-8 and passing to the ANSI functions, an ANSI function would
likely interpret the UTF-8 string as some string in the current code page and
create a filepath that represents every single byte of the UTF-8 string.
These behaviors are not only broken but also disregard the documented
INI settings.
This patch solves the issies with the multibyte paths on Windows by
intelligently enforcing the usage of the Unicode aware APIs. For
functions expect Unicode (fe CreateFileW, FindFirstFileW, etc.), arguments
will be converted to UTF-16 wide chars. For functions returning Unicode
aware data (fe GetCurrentDirectoryW, etc.), resulting wide string is
converted back to char's depending on the current PHP charset settings,
either to the current ANSI codepage (this is the behavior prior to this patch)
or to UTF-8 (the default behavior).
In a particular case, users might have to explicitly set
internal_encoding or default_charset, if filenames in ANSI codepage are
necessary. Current tests show no regressions and witness that this will be an
exotic case, the current default UTF-8 encoding is compatible with any
supported system. The dependency libraries are long switching to Unicode APIs,
so some tests were also added for extensions not directly related to streams.
At large, the patch brings over 150 related tests into the core. Those target
and was run on various environments with European, Asian, etc. codepages.
General PHP frameworks was tested and showed no regressions.
The impact on the current C code base is low, the most places affected
are the Windows only places in the three files tsrm_win32.c, zend_virtual_cwd.c
and plain_wrapper.c. The actual implementation of the most of the wide
char supporting functionality is in win32/ioutil.* and win32/codepage.*,
several low level functionsare extended in place to avoid reimplementation for
now. No performance impact was sighted. As previously mentioned, the ANSI APIs
used prior the patch perform Unicode conversions internally. Using the
Unicode APIs directly while doing custom conversions just retains the status
quo. The ways to optimize it are open (fe. by implementing caching for the
strings converted to wide variants).
The long path implementation is user transparent. If a path exceeds the
length of _MAX_PATH, it'll be automatically prefixed with \\?\. The MAXPATHLEN
is set to 2048 bytes.
Appreciation to Pierre Joye, Matt Ficken, @algo13 and others for tips, ideas
and testing.
Thanks.
2016-06-20 15:32:19 +08:00
|
|
|
#ifdef ZEND_WIN32
|
|
|
|
/* Uses INI settings, so needs to be run after it. */
|
|
|
|
php_win32_cp_setup();
|
|
|
|
#endif
|
|
|
|
|
2021-01-26 22:53:49 +08:00
|
|
|
zend_optimizer_startup();
|
|
|
|
|
2000-12-27 23:43:15 +08:00
|
|
|
#ifdef ZTS
|
|
|
|
tsrm_set_new_thread_end_handler(zend_new_thread_end_handler);
|
2017-03-04 17:39:13 +08:00
|
|
|
tsrm_set_shutdown_handler(zend_interned_strings_dtor);
|
2000-12-27 23:43:15 +08:00
|
|
|
#endif
|
1999-04-08 02:10:10 +08:00
|
|
|
}
|
2007-11-03 03:40:39 +08:00
|
|
|
/* }}} */
|
1999-04-08 02:10:10 +08:00
|
|
|
|
2014-12-14 06:06:14 +08:00
|
|
|
void zend_register_standard_ini_entries(void) /* {{{ */
|
2002-11-20 01:51:30 +08:00
|
|
|
{
|
2022-05-06 21:25:44 +08:00
|
|
|
zend_register_ini_entries_ex(ini_entries, 0, MODULE_PERSISTENT);
|
2002-11-20 01:51:30 +08:00
|
|
|
}
|
2007-11-03 03:40:39 +08:00
|
|
|
/* }}} */
|
2002-11-20 01:51:30 +08:00
|
|
|
|
2019-01-07 19:28:51 +08:00
|
|
|
|
2002-09-17 20:42:11 +08:00
|
|
|
/* Unlink the global (r/o) copies of the class, function and constant tables,
|
|
|
|
* and use a fresh r/w copy for the startup thread
|
|
|
|
*/
|
2020-08-28 21:41:27 +08:00
|
|
|
zend_result zend_post_startup(void) /* {{{ */
|
2002-09-17 20:42:11 +08:00
|
|
|
{
|
2007-11-03 03:40:39 +08:00
|
|
|
#ifdef ZTS
|
2012-05-03 22:39:53 +08:00
|
|
|
zend_encoding **script_encoding_list;
|
|
|
|
|
2002-09-17 20:42:11 +08:00
|
|
|
zend_compiler_globals *compiler_globals = ts_resource(compiler_globals_id);
|
2002-09-19 06:16:22 +08:00
|
|
|
zend_executor_globals *executor_globals = ts_resource(executor_globals_id);
|
2018-10-26 01:30:51 +08:00
|
|
|
#endif
|
|
|
|
|
2021-08-11 16:28:52 +08:00
|
|
|
startup_done = true;
|
2019-07-04 16:28:12 +08:00
|
|
|
|
2018-10-26 01:30:51 +08:00
|
|
|
if (zend_post_startup_cb) {
|
2020-08-28 21:41:27 +08:00
|
|
|
zend_result (*cb)(void) = zend_post_startup_cb;
|
2018-10-26 01:30:51 +08:00
|
|
|
|
|
|
|
zend_post_startup_cb = NULL;
|
|
|
|
if (cb() != SUCCESS) {
|
|
|
|
return FAILURE;
|
|
|
|
}
|
|
|
|
}
|
2002-09-17 20:42:11 +08:00
|
|
|
|
2018-10-26 01:30:51 +08:00
|
|
|
#ifdef ZTS
|
2002-09-19 06:16:22 +08:00
|
|
|
*GLOBAL_FUNCTION_TABLE = *compiler_globals->function_table;
|
|
|
|
*GLOBAL_CLASS_TABLE = *compiler_globals->class_table;
|
|
|
|
*GLOBAL_CONSTANTS_TABLE = *executor_globals->zend_constants;
|
2018-10-17 20:52:50 +08:00
|
|
|
global_map_ptr_last = compiler_globals->map_ptr_last;
|
2007-01-12 22:37:46 +08:00
|
|
|
|
|
|
|
short_tags_default = CG(short_tags);
|
2008-03-18 16:36:30 +08:00
|
|
|
compiler_options_default = CG(compiler_options);
|
2007-10-11 09:03:19 +08:00
|
|
|
|
2014-12-14 06:06:14 +08:00
|
|
|
zend_destroy_rsrc_list(&EG(persistent_list));
|
2003-12-12 18:50:23 +08:00
|
|
|
free(compiler_globals->function_table);
|
Implemented preloading RFC: https://wiki.php.net/rfc/preload.
Squashed commit of the following:
commit 106c815fffb8eb3efe00a27a5229cb1f8ffc9736
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Nov 14 16:36:44 2018 +0300
Added NEWS entry
commit 1dacd5e20b7043368ef9e80db296d1781134b6fd
Merge: d516139abf ba99aa133c
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Nov 14 16:33:37 2018 +0300
Merge branch 'master' into preload
* master:
Fixed issues related to optimization and persitence of classes linked with interfaces, traits or internal classes.
Added possiblity to avoid signal handlers reinitialization on each request.
commit d516139abf5ffbd495ee6037f1dc04a1cfe588a7
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Nov 14 16:13:15 2018 +0300
Override opcache.preload for testing
commit 162b154d0bbfbaf8ef93975f7e56a1353236903d
Merge: 45fdd034ce 8bda22592e
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Nov 14 15:38:09 2018 +0300
Merge branch 'master' into preload
* master: (34 commits)
Eliminate useless $this related check
Eliminate useless $this related checks
Replace zend_parse_method_parameters() by zend_parse_parameters() and avoid useless checks.
Replace getThis() by EX(This), when additional check is not necessary.
Fixed tests
Validate length on socket_write
Fix compilation on x32
Fix #77141: Signedness issue in SOAP when precision=-1
Support SQLite3 @name notation
Remove lexer files generated by RE2C
Update libmagic.patch [ci skip]
Update libmagic.patch [ci skip]
Fork test with pcre.jit=0
Rework magic data
Fix regex
Fix regex
Rework magic data
Sync one more upstream libmagic piece
Suppress already used warning
Ignore getaddrinfo failed message
...
commit 45fdd034ceceb68e8fb23bd6e70d627f17dfd411
Author: Dmitry Stogov <dmitry@zend.com>
Date: Fri Nov 9 13:07:03 2018 +0300
Properly resolve magic method of preloaded classes inherited from internal ones.
commit 34645aeb4272b71a81a7e0d91f27eded557b78be
Author: Dmitry Stogov <dmitry@zend.com>
Date: Thu Nov 8 15:29:17 2018 +0300
Don't preload constants defined during preload script excution.
commit cef0d67c3e5aac89b3d606fbd8d445225c07c83f
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Nov 7 15:56:54 2018 +0300
Support for class aliasses
commit 08ffc9a552c7cf4fbff1a4b3d2de4e7c33f4120d
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Nov 7 15:34:39 2018 +0300
Resolve constants only in linked classes
commit 8d3429cda83c87646eef0006d5cda075f2400b24
Author: Dmitry Stogov <dmitry@zend.com>
Date: Tue Nov 6 11:56:39 2018 +0300
Fixed preloading of references to internal classes.
commit 7ae3a47d20e83f7d804506c6d50f6a392199260b
Merge: 9b0a53ed1c 049f239cfc
Author: Dmitry Stogov <dmitry@zend.com>
Date: Tue Nov 6 11:37:15 2018 +0300
Merge branch 'master' into preload
* master:
Update NEWS [ci skip]
Update NEWS [ci skip]
Update libmagic.patch [ci skip]
Update libmagic.patch [ci skip]
Declare function proto in header
Declare function proto in header
Fix #76825: Undefined symbols ___cpuid_count
NEWS
Fix: #77110 undefined symbol zend_string_equal_val in C++ build
Fix #77105: Use position:sticky for <th> in `phpinfo()`
Implement handling for JIT recognition when cross compiling
Backport 7f5f4601 for 7.2
Fix #76348: WSDL_CACHE_MEMORY causes Segmentation fault
Rework places in libmagic regarding previous CVE-2014-3538 fixes
Change the way JIT availability is checked
Fix a test for ldap extension
Fixed bug #77092
Future-proof email addresses
commit 9b0a53ed1cd5995efae0d71e1941d1db4ef6ba39
Author: Dmitry Stogov <dmitry@zend.com>
Date: Fri Nov 2 14:54:44 2018 +0300
We don't need preload_restart() here
commit 0bd17bd43890423e1e98a5925f11cea93da3df55
Author: Dmitry Stogov <dmitry@zend.com>
Date: Fri Nov 2 14:44:30 2018 +0300
EG(*) may be not initializd at this point - use CG(*).
commit b610467051d8a3687a60ffc2957bc353cb6b3bd4
Merge: 3a9d90f74a 67e0138c0d
Author: Dmitry Stogov <dmitry@zend.com>
Date: Fri Nov 2 11:33:37 2018 +0300
Merge branch 'master' into preload
* master:
Future-proof email addresses...
Update email addresses. We're still @Zend, but future proofing it...
commit 3a9d90f74a3d890cb59658d604d5a202e3aee256
Author: Dmitry Stogov <dmitry@zend.com>
Date: Thu Nov 1 15:19:48 2018 +0300
Fexed resolution of method clones
commit aea85c65bd1795d0750dee6ac0e476acd2ac9dd7
Author: Dmitry Stogov <dmitry@zend.com>
Date: Thu Nov 1 11:45:50 2018 +0300
Prevent inlining of method copied from trait
commit 36b644fbb738e7548ccb436e5d04d653d93cce14
Merge: 7a20781d2e b91690c892
Author: Dmitry Stogov <dmitry@zend.com>
Date: Thu Nov 1 10:56:02 2018 +0300
Merge branch 'master' into preload
* master:
Fix stray newline that caused this test to fail
Fix session tests that fail if error_log is set
This test needs to log to stdout
Fix error condition
Fixed bug #77081 ftruncate() changes seek pointer in c mode
Fix and improve test case
commit 7a20781d2ee694262f913a612d8b0b6a24ceff7b
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 31 00:52:46 2018 +0300
Added test
commit 4a57b5d563f9c9616f3c236f57ccd09d8a66f146
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 31 00:50:21 2018 +0300
Fixed preloading of classes linked with traits
commit 68c4f99e23695e74eafa43097ecab62392bad3ee
Author: Dmitry Stogov <dmitry@zend.com>
Date: Tue Oct 30 16:25:14 2018 +0300
Added test
commit 38ab7ef4cf429dcfd5dfb18f844242cdf3a4d61f
Merge: eb6e2c529f bf38e6c10a
Author: Dmitry Stogov <dmitry@zend.com>
Date: Tue Oct 30 16:14:39 2018 +0300
Merge branch 'master' into preload
* master:
Keep original value of "prototype"
commit eb6e2c529f8cedf6823346387dd8b0ba6a4f045b
Merge: 562049510f 2fefa8c61e
Author: Dmitry Stogov <dmitry@zend.com>
Date: Tue Oct 30 15:35:39 2018 +0300
Merge branch 'master' into preload
* master:
Call function_add_ref() in proper place
Updated to version 2018.7 (2018g)
Updated to version 2018.7 (2018g)
Updated to version 2018.7 (2018g)
Reslove inherited op_array references once afrer all optimizations.
commit 562049510f605c21cd46fc3b6f97ed15bfe7b0dc
Merge: e806cb732a 4828fb7b6b
Author: Dmitry Stogov <dmitry@zend.com>
Date: Tue Oct 30 10:29:49 2018 +0300
Merge branch 'master' into preload
* master:
[ci skip] Update NEWS
[ci skip] Update NEWS
[ci skip] Update NEWS
fix bug #77079
Add missing null initialization
Remove redundant mbfl_string_init calls
Use zend_string for mbstring last encoding cache
commit e806cb732a2a3f1e409528988a0571421c541078
Author: Dmitry Stogov <dmitry@zend.com>
Date: Mon Oct 29 22:32:15 2018 +0300
Fixed double-free
commit 2f697ef8af0e7b21c47707b2d688880e8c987a8b
Author: Dmitry Stogov <dmitry@zend.com>
Date: Mon Oct 29 22:07:32 2018 +0300
typo
commit c559f22b3e61b38761831d9610889d28ba6875e0
Merge: 310631cc05 ea2e67876a
Author: Dmitry Stogov <dmitry@zend.com>
Date: Mon Oct 29 21:59:27 2018 +0300
Merge branch 'master' into preload
* master:
Stop Apache if PHP wasn't started successful.
Execute zend_post_startup() with module_initialized flag set.
Removed dead code
Fix mb_strrpos() with encoding passed as 3rd param
commit 310631cc0565ac87091c4f1a8a9f739a13e7e778
Author: Dmitry Stogov <dmitry@zend.com>
Date: Mon Oct 29 16:48:42 2018 +0300
Stop Apache if PHP wasn't started successful.
commit 0a24d7ba8f3280507c9663b32e14030212cf8491
Author: Dmitry Stogov <dmitry@zend.com>
Date: Mon Oct 29 16:25:49 2018 +0300
Avoid use-after-free in main thread
commit 17a3cb4a2ab271c2b2357c04e36efa64e02444ff
Author: Dmitry Stogov <dmitry@zend.com>
Date: Mon Oct 29 15:25:17 2018 +0300
Execute zend_post_startup() with module_initialized flag set.
commit 6d4b22c518bec956e9632fad4329360304d17fd7
Author: Dmitry Stogov <dmitry@zend.com>
Date: Mon Oct 29 14:12:20 2018 +0300
Override SAPI.ub_write and SAPI.flush for preloading
commit 386c9d3470168f70afe5d3b72a58ea0c0da1519c
Merge: d7fbb4d402 359f19edc9
Author: Dmitry Stogov <dmitry@zend.com>
Date: Mon Oct 29 13:49:24 2018 +0300
Merge branch 'master' into preload
* master:
Optimize substr() edge-case conditions
[ci skip] Update UPGRADING
Fix #71592: External entity processing never fails
Add TIDY_TAG_* constants supported by libtidy 5
Add is_iterable to opcache Optimizer
commit d7fbb4d402a18c8fd1c49e0c92afd9f9e513bc7a
Author: Dmitry Stogov <dmitry@zend.com>
Date: Fri Oct 26 13:11:54 2018 +0300
Restore preload state if it was already loaded in another process.
commit 0fe9ea1c07822b5d4672cece2c180bf9795e16e4
Author: Dmitry Stogov <dmitry@zend.com>
Date: Fri Oct 26 12:29:06 2018 +0300
Removed dead code
commit 3a2d1bcc1fd27b6983522c262931fc0187c0afef
Author: Dmitry Stogov <dmitry@zend.com>
Date: Fri Oct 26 00:19:40 2018 +0300
Support for builds without ZEND_SIGNALS
commit e6b76ecb4beea3b922bf7529050e3828f745dedb
Merge: 4531fbf931 68694c9997
Author: Dmitry Stogov <dmitry@zend.com>
Date: Thu Oct 25 23:43:25 2018 +0300
Merge branch 'master' into preload
* master:
Don't wrap php_module_shutdown() with zend_try. executor_globals are released in ZTS build, and this leads to crash.
[ci skip] Fix indentation in UPGRADING.
commit 4531fbf9310bfb7bb579134cc84e8c10c5d42059
Author: Dmitry Stogov <dmitry@zend.com>
Date: Thu Oct 25 22:44:49 2018 +0300
Disable linking and preloading of classes those parent or one of interface or trait is an internal class.
commit a594a618ce98242c1d273eb9ede75b4f6b4635d8
Author: Dmitry Stogov <dmitry@zend.com>
Date: Thu Oct 25 22:30:51 2018 +0300
Cleanup
- remove useless ZCSG(saved_map_ptr_last)
- move preloaded classes/functions clean-up code back into better place
commit ab9a40f63cfa1a205b8f853b7e0c2ce61edabb32
Author: Dmitry Stogov <dmitry@zend.com>
Date: Thu Oct 25 20:52:51 2018 +0300
Added support for preloaded classes/functions in ZTS build
commit e3c65db099517082b66dd20ea57e1bda649a7aa5
Merge: 4f57c1e029 33e777acbf
Author: Dmitry Stogov <dmitry@zend.com>
Date: Thu Oct 25 20:52:26 2018 +0300
Merge branch 'master' into preload
* master:
Improved shared interned strings handling. The previous implementation worked incorrectly in ZTS build. It changed strings only in function/class tables of one thread. Now all threads gets the same shared interned strings. Also, on shutdown, we don't try to replace SHM interned strings back to process strings, but delay dettachment of SHM instead.
Don't use request heap at shutdown
Don't optimize function if inference failed
Fixed bug #77058
Improve "narrowing" error message
bump versions
commit 4f57c1e029ce9c24bd699ea61b05973c4665bc32
Author: Dmitry Stogov <dmitry@zend.com>
Date: Thu Oct 25 15:29:58 2018 +0300
Cleanup (move preload_shutdown() call to better place)
commit 26587a95c071cf9dd098199eb3708fca8adae243
Author: Dmitry Stogov <dmitry@zend.com>
Date: Thu Oct 25 14:30:51 2018 +0300
eol
commit d70cb10480fdc7d814495150cd48e43d4147138f
Author: Dmitry Stogov <dmitry@zend.com>
Date: Thu Oct 25 14:30:20 2018 +0300
cleanup
commit aabe685dbb887e91c240b6c5553193889bcfc540
Merge: d9fc51bc3b 40808ac41e
Author: Dmitry Stogov <dmitry@zend.com>
Date: Thu Oct 25 12:42:51 2018 +0300
Merge branch 'master' into preload
* master:
Remove unused var
Remove ext/json parser files generated by bison
Fix run-tests.php for running phpdbg and certain test sections
Normalize .gitignore
commit d9fc51bc3bdfbd7f4149a884b09e3c09a41f7a8d
Merge: b5ffba0faf b6ef8998d5
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 24 15:59:24 2018 +0300
Merge branch 'master' into preload
* master:
Fixed reseting of interned strings buffer.
commit b5ffba0fafb4d940336d5f5fe93950dad1d8d779
Merge: e4a7ef0c43 a404383118
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 24 12:46:28 2018 +0300
Merge branch 'master' into preload
* master:
Fixed build in directory different from source
commit e4a7ef0c431ec97cdd00e44dfa0ef17887d1e5e3
Merge: 811f20aaa5 d1e14e2cc0
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 24 11:59:43 2018 +0300
Merge branch 'master' into preload
* master: (29 commits)
Make php_plain_files_wrapper to be writable (workaround for swoole)
Remove phpdbg parser files generated by bison
Fix conflicts in phpdbg parser
Refetetch function name on exceptional path to allow better code on fast code path.
fix typo in sysvsem.c
Fixed bug #50675
bump to 7.2.13-dev
[ci skip] Update NEWS wrt. php-7.3.0RC4 tagging
Inlining in the most frequently used code paths
Fixed test failurs introduced by 9c144e0d8217d1ef7a83c2498214308b21af749f
Use persistent strings only for persistent connections
Fix accessibility checks for dynamic properties
Updated to version 2018.6 (2018f)
Updated to version 2018.6 (2018f)
Updated to version 2018.6 (2018f)
Fix arginfo and clean up fpm_get_status
Defragment two Zend related Makefile fragments together
[ci skip] Remove automake and aclocal in comments
Fix #75282: xmlrpc_encode_request() crashes
Fix tests for ICU 63.1
...
commit 811f20aaa5030035666d9f325dd7c64632c70a50
Author: Dmitry Stogov <dmitry@zend.com>
Date: Mon Oct 22 14:10:49 2018 +0300
Added information about preloading to opcache_get_status()
commit 093e8b1bbffdc07d217a543613ea14c3eeac710e
Author: Dmitry Stogov <dmitry@zend.com>
Date: Fri Oct 19 13:46:23 2018 +0300
Added warning message
commit a2ba970ce3d0ac51ebfbe1bfc2dc7b99b9750a75
Author: Dmitry Stogov <dmitry@zend.com>
Date: Fri Oct 19 13:35:40 2018 +0300
Added test
commit b67e28367c11db50360e664a7ad6ac95b393f2e4
Author: Dmitry Stogov <dmitry@zend.com>
Date: Fri Oct 19 13:33:12 2018 +0300
Don't preload functions declared at run-time.
commit b0139dc22854ee000586ef83c149d7d25181da60
Merge: a609520adb 3fe698b904
Author: Dmitry Stogov <dmitry@zend.com>
Date: Fri Oct 19 13:23:14 2018 +0300
Merge branch 'master' into preload
* master:
Mark "top-level" functions.
Don't initialize static_member_tables during start-up, when inherit internal classes.
[ci skip] Update NEWS
[ci skip] Update NEWS
[ci skip] Update NEWS
Fix #77035: The phpize and ./configure create redundant .deps file
Remove outdated PEAR artefacts
Fix tests/output/bug74815.phpt generating errors.log
Revert "Use C++ symbols, when C++11 or upper is compiled"
Use C++ symbols, when C++11 or upper is compiled
Added new line
Remove stamp-h
Move all testing docs to qa.php.net
Fix a typo in UPGRADING.INTERNALS
Fix test when it's run on another drive
[ci skip] Update UPGRADING wrt. tidyp support
Fixed incorrect reallocation
Fix #77027: tidy::getOptDoc() not available on Windows
Run CI tests under opcache.protect_memory=1
commit a609520adbc0bf12701d467bae4a016fde43231e
Merge: ac8f45f61b b6ac50f9e6
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 17 17:01:05 2018 +0300
Merge branch 'master' into preload
* master:
Fixed comment
Micro optimizations
Mark "top-level" classes
commit ac8f45f61b561af9aee629232bc3705143ceaac3
Merge: 632b30b545 d57cd36e47
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 17 15:53:41 2018 +0300
Merge branch 'master' into preload
* master:
Immutable clases and op_arrays.
commit 632b30b5451c8fdf0879a3ba4d937ff4ecfc8ce7
Merge: d33908a99a cd0c36c3f9
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 17 15:04:43 2018 +0300
Merge branch 'immutable' into preload
* immutable:
Remove the "auto" encoding
Fixed bug #77025
Add vtbls for EUC-TW encoding
commit cd0c36c3f943849e5b97a8dbe2dd029fbeab3df9
Merge: 4740dabb84 ad6738e886
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 17 14:43:38 2018 +0300
Merge branch 'master' into immutable
* master:
Remove the "auto" encoding
Fixed bug #77025
Add vtbls for EUC-TW encoding
commit d33908a99a3c746f188e268df3db541591f6fcc2
Merge: 21e0bebca3 4740dabb84
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 17 14:14:23 2018 +0300
Merge branch 'immutable' into preload
* immutable:
Reverted back ce->iterator_funcs_ptr. Initialize ce->iterator_funcs_ptr fields in immutable classes.
commit 4740dabb843c6d4f7f866b4a2456073c9eaf4c77
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 17 14:12:28 2018 +0300
Reverted back ce->iterator_funcs_ptr. Initialize ce->iterator_funcs_ptr fields in immutable classes.
commit 21e0bebca3e6fff3c3484ee46f9aa3ac4e98eaeb
Merge: c78277ae84 ad7a78b253
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 17 12:29:59 2018 +0300
Merge branch 'immutable' into preload
* immutable:
Added comment
Added type cast
Moved static class members initialization into the proper place.
Removed redundand assertion
Removed duplicate code
Hide offset encoding magic in ZEND_MAP_PTR_IS_OFFSET(), ZEND_MAP_PTR_OFFSET2PTR() and ZEND_MAP_PTR_PTR2OFFSET() macros.
typo
Remove unused variable makefile_am_files
Classify object handlers are required/optional
Add support for getting SKIP_TAGSTART and SKIP_WHITE options
Remove some obsolete config_vars.mk occurrences
Remove bsd_converted from .gitignore
Remove configuration parser and scanners ignores
Remove obsolete buildconf.stamp from .gitignore
[ci skip] Add magicdata.patch exception to .gitignore
Remove outdated ext/spl/examples items from .gitignore
Remove unused test.inc in ext/iconv/tests
commit ad7a78b253be970db70c2251e66f9297d8e7f829
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 17 11:46:30 2018 +0300
Added comment
commit 0276ea51875bab37be01a4dc5e5a047c5698c571
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 17 11:42:43 2018 +0300
Added type cast
commit c63fc5d5f19c58498108d1698055b2b442227eb3
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 17 11:36:51 2018 +0300
Moved static class members initialization into the proper place.
commit b945548e9306b1826c881918858b5e5aa3eb3002
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 17 11:21:03 2018 +0300
Removed redundand assertion
commit d5a41088401814c829847db212488f8aae39bcd2
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 17 11:19:13 2018 +0300
Removed duplicate code
commit 8dadca8864e66de70a24bdf1181bcf7dd8fb27d7
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 17 11:05:43 2018 +0300
Hide offset encoding magic in ZEND_MAP_PTR_IS_OFFSET(), ZEND_MAP_PTR_OFFSET2PTR() and ZEND_MAP_PTR_PTR2OFFSET() macros.
commit 9ef07c88bd76801e2d4fbfeab3ebfd6e6a67ac5f
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 17 10:48:29 2018 +0300
typo
commit a06f0f3d3aba53e766046221ee44fb9720389ecc
Merge: 94099586ec 3412345ffe
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 17 10:47:07 2018 +0300
Merge branch 'master' into immutable
* master:
Remove unused variable makefile_am_files
Classify object handlers are required/optional
Add support for getting SKIP_TAGSTART and SKIP_WHITE options
Remove some obsolete config_vars.mk occurrences
Remove bsd_converted from .gitignore
Remove configuration parser and scanners ignores
Remove obsolete buildconf.stamp from .gitignore
[ci skip] Add magicdata.patch exception to .gitignore
Remove outdated ext/spl/examples items from .gitignore
Remove unused test.inc in ext/iconv/tests
commit c78277ae84b21067744d1701949e4e1fadd8872a
Author: Dmitry Stogov <dmitry@zend.com>
Date: Tue Oct 16 17:25:35 2018 +0300
Preloadsing support for opcache restart
commit f76a955c02f6a033d4656d5e0d9dad9a8e83cc86
Author: Dmitry Stogov <dmitry@zend.com>
Date: Tue Oct 16 13:52:36 2018 +0300
Fixed incorrect signal handlers overriding
commit 0810ce0d8165d4b752267f035f9fa0aaa1698ceb
Author: Dmitry Stogov <dmitry@zend.com>
Date: Mon Oct 15 23:38:48 2018 +0300
An attempt to implemnt "preloading" ability.
commit 94099586ec599117581ca01c15b1f6c5f749e23a
Author: Dmitry Stogov <dmitry@zend.com>
Date: Mon Oct 15 23:34:01 2018 +0300
Immutable clases and op_arrays
2018-11-14 21:46:05 +08:00
|
|
|
compiler_globals->function_table = NULL;
|
2003-12-12 18:50:23 +08:00
|
|
|
free(compiler_globals->class_table);
|
Implemented preloading RFC: https://wiki.php.net/rfc/preload.
Squashed commit of the following:
commit 106c815fffb8eb3efe00a27a5229cb1f8ffc9736
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Nov 14 16:36:44 2018 +0300
Added NEWS entry
commit 1dacd5e20b7043368ef9e80db296d1781134b6fd
Merge: d516139abf ba99aa133c
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Nov 14 16:33:37 2018 +0300
Merge branch 'master' into preload
* master:
Fixed issues related to optimization and persitence of classes linked with interfaces, traits or internal classes.
Added possiblity to avoid signal handlers reinitialization on each request.
commit d516139abf5ffbd495ee6037f1dc04a1cfe588a7
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Nov 14 16:13:15 2018 +0300
Override opcache.preload for testing
commit 162b154d0bbfbaf8ef93975f7e56a1353236903d
Merge: 45fdd034ce 8bda22592e
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Nov 14 15:38:09 2018 +0300
Merge branch 'master' into preload
* master: (34 commits)
Eliminate useless $this related check
Eliminate useless $this related checks
Replace zend_parse_method_parameters() by zend_parse_parameters() and avoid useless checks.
Replace getThis() by EX(This), when additional check is not necessary.
Fixed tests
Validate length on socket_write
Fix compilation on x32
Fix #77141: Signedness issue in SOAP when precision=-1
Support SQLite3 @name notation
Remove lexer files generated by RE2C
Update libmagic.patch [ci skip]
Update libmagic.patch [ci skip]
Fork test with pcre.jit=0
Rework magic data
Fix regex
Fix regex
Rework magic data
Sync one more upstream libmagic piece
Suppress already used warning
Ignore getaddrinfo failed message
...
commit 45fdd034ceceb68e8fb23bd6e70d627f17dfd411
Author: Dmitry Stogov <dmitry@zend.com>
Date: Fri Nov 9 13:07:03 2018 +0300
Properly resolve magic method of preloaded classes inherited from internal ones.
commit 34645aeb4272b71a81a7e0d91f27eded557b78be
Author: Dmitry Stogov <dmitry@zend.com>
Date: Thu Nov 8 15:29:17 2018 +0300
Don't preload constants defined during preload script excution.
commit cef0d67c3e5aac89b3d606fbd8d445225c07c83f
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Nov 7 15:56:54 2018 +0300
Support for class aliasses
commit 08ffc9a552c7cf4fbff1a4b3d2de4e7c33f4120d
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Nov 7 15:34:39 2018 +0300
Resolve constants only in linked classes
commit 8d3429cda83c87646eef0006d5cda075f2400b24
Author: Dmitry Stogov <dmitry@zend.com>
Date: Tue Nov 6 11:56:39 2018 +0300
Fixed preloading of references to internal classes.
commit 7ae3a47d20e83f7d804506c6d50f6a392199260b
Merge: 9b0a53ed1c 049f239cfc
Author: Dmitry Stogov <dmitry@zend.com>
Date: Tue Nov 6 11:37:15 2018 +0300
Merge branch 'master' into preload
* master:
Update NEWS [ci skip]
Update NEWS [ci skip]
Update libmagic.patch [ci skip]
Update libmagic.patch [ci skip]
Declare function proto in header
Declare function proto in header
Fix #76825: Undefined symbols ___cpuid_count
NEWS
Fix: #77110 undefined symbol zend_string_equal_val in C++ build
Fix #77105: Use position:sticky for <th> in `phpinfo()`
Implement handling for JIT recognition when cross compiling
Backport 7f5f4601 for 7.2
Fix #76348: WSDL_CACHE_MEMORY causes Segmentation fault
Rework places in libmagic regarding previous CVE-2014-3538 fixes
Change the way JIT availability is checked
Fix a test for ldap extension
Fixed bug #77092
Future-proof email addresses
commit 9b0a53ed1cd5995efae0d71e1941d1db4ef6ba39
Author: Dmitry Stogov <dmitry@zend.com>
Date: Fri Nov 2 14:54:44 2018 +0300
We don't need preload_restart() here
commit 0bd17bd43890423e1e98a5925f11cea93da3df55
Author: Dmitry Stogov <dmitry@zend.com>
Date: Fri Nov 2 14:44:30 2018 +0300
EG(*) may be not initializd at this point - use CG(*).
commit b610467051d8a3687a60ffc2957bc353cb6b3bd4
Merge: 3a9d90f74a 67e0138c0d
Author: Dmitry Stogov <dmitry@zend.com>
Date: Fri Nov 2 11:33:37 2018 +0300
Merge branch 'master' into preload
* master:
Future-proof email addresses...
Update email addresses. We're still @Zend, but future proofing it...
commit 3a9d90f74a3d890cb59658d604d5a202e3aee256
Author: Dmitry Stogov <dmitry@zend.com>
Date: Thu Nov 1 15:19:48 2018 +0300
Fexed resolution of method clones
commit aea85c65bd1795d0750dee6ac0e476acd2ac9dd7
Author: Dmitry Stogov <dmitry@zend.com>
Date: Thu Nov 1 11:45:50 2018 +0300
Prevent inlining of method copied from trait
commit 36b644fbb738e7548ccb436e5d04d653d93cce14
Merge: 7a20781d2e b91690c892
Author: Dmitry Stogov <dmitry@zend.com>
Date: Thu Nov 1 10:56:02 2018 +0300
Merge branch 'master' into preload
* master:
Fix stray newline that caused this test to fail
Fix session tests that fail if error_log is set
This test needs to log to stdout
Fix error condition
Fixed bug #77081 ftruncate() changes seek pointer in c mode
Fix and improve test case
commit 7a20781d2ee694262f913a612d8b0b6a24ceff7b
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 31 00:52:46 2018 +0300
Added test
commit 4a57b5d563f9c9616f3c236f57ccd09d8a66f146
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 31 00:50:21 2018 +0300
Fixed preloading of classes linked with traits
commit 68c4f99e23695e74eafa43097ecab62392bad3ee
Author: Dmitry Stogov <dmitry@zend.com>
Date: Tue Oct 30 16:25:14 2018 +0300
Added test
commit 38ab7ef4cf429dcfd5dfb18f844242cdf3a4d61f
Merge: eb6e2c529f bf38e6c10a
Author: Dmitry Stogov <dmitry@zend.com>
Date: Tue Oct 30 16:14:39 2018 +0300
Merge branch 'master' into preload
* master:
Keep original value of "prototype"
commit eb6e2c529f8cedf6823346387dd8b0ba6a4f045b
Merge: 562049510f 2fefa8c61e
Author: Dmitry Stogov <dmitry@zend.com>
Date: Tue Oct 30 15:35:39 2018 +0300
Merge branch 'master' into preload
* master:
Call function_add_ref() in proper place
Updated to version 2018.7 (2018g)
Updated to version 2018.7 (2018g)
Updated to version 2018.7 (2018g)
Reslove inherited op_array references once afrer all optimizations.
commit 562049510f605c21cd46fc3b6f97ed15bfe7b0dc
Merge: e806cb732a 4828fb7b6b
Author: Dmitry Stogov <dmitry@zend.com>
Date: Tue Oct 30 10:29:49 2018 +0300
Merge branch 'master' into preload
* master:
[ci skip] Update NEWS
[ci skip] Update NEWS
[ci skip] Update NEWS
fix bug #77079
Add missing null initialization
Remove redundant mbfl_string_init calls
Use zend_string for mbstring last encoding cache
commit e806cb732a2a3f1e409528988a0571421c541078
Author: Dmitry Stogov <dmitry@zend.com>
Date: Mon Oct 29 22:32:15 2018 +0300
Fixed double-free
commit 2f697ef8af0e7b21c47707b2d688880e8c987a8b
Author: Dmitry Stogov <dmitry@zend.com>
Date: Mon Oct 29 22:07:32 2018 +0300
typo
commit c559f22b3e61b38761831d9610889d28ba6875e0
Merge: 310631cc05 ea2e67876a
Author: Dmitry Stogov <dmitry@zend.com>
Date: Mon Oct 29 21:59:27 2018 +0300
Merge branch 'master' into preload
* master:
Stop Apache if PHP wasn't started successful.
Execute zend_post_startup() with module_initialized flag set.
Removed dead code
Fix mb_strrpos() with encoding passed as 3rd param
commit 310631cc0565ac87091c4f1a8a9f739a13e7e778
Author: Dmitry Stogov <dmitry@zend.com>
Date: Mon Oct 29 16:48:42 2018 +0300
Stop Apache if PHP wasn't started successful.
commit 0a24d7ba8f3280507c9663b32e14030212cf8491
Author: Dmitry Stogov <dmitry@zend.com>
Date: Mon Oct 29 16:25:49 2018 +0300
Avoid use-after-free in main thread
commit 17a3cb4a2ab271c2b2357c04e36efa64e02444ff
Author: Dmitry Stogov <dmitry@zend.com>
Date: Mon Oct 29 15:25:17 2018 +0300
Execute zend_post_startup() with module_initialized flag set.
commit 6d4b22c518bec956e9632fad4329360304d17fd7
Author: Dmitry Stogov <dmitry@zend.com>
Date: Mon Oct 29 14:12:20 2018 +0300
Override SAPI.ub_write and SAPI.flush for preloading
commit 386c9d3470168f70afe5d3b72a58ea0c0da1519c
Merge: d7fbb4d402 359f19edc9
Author: Dmitry Stogov <dmitry@zend.com>
Date: Mon Oct 29 13:49:24 2018 +0300
Merge branch 'master' into preload
* master:
Optimize substr() edge-case conditions
[ci skip] Update UPGRADING
Fix #71592: External entity processing never fails
Add TIDY_TAG_* constants supported by libtidy 5
Add is_iterable to opcache Optimizer
commit d7fbb4d402a18c8fd1c49e0c92afd9f9e513bc7a
Author: Dmitry Stogov <dmitry@zend.com>
Date: Fri Oct 26 13:11:54 2018 +0300
Restore preload state if it was already loaded in another process.
commit 0fe9ea1c07822b5d4672cece2c180bf9795e16e4
Author: Dmitry Stogov <dmitry@zend.com>
Date: Fri Oct 26 12:29:06 2018 +0300
Removed dead code
commit 3a2d1bcc1fd27b6983522c262931fc0187c0afef
Author: Dmitry Stogov <dmitry@zend.com>
Date: Fri Oct 26 00:19:40 2018 +0300
Support for builds without ZEND_SIGNALS
commit e6b76ecb4beea3b922bf7529050e3828f745dedb
Merge: 4531fbf931 68694c9997
Author: Dmitry Stogov <dmitry@zend.com>
Date: Thu Oct 25 23:43:25 2018 +0300
Merge branch 'master' into preload
* master:
Don't wrap php_module_shutdown() with zend_try. executor_globals are released in ZTS build, and this leads to crash.
[ci skip] Fix indentation in UPGRADING.
commit 4531fbf9310bfb7bb579134cc84e8c10c5d42059
Author: Dmitry Stogov <dmitry@zend.com>
Date: Thu Oct 25 22:44:49 2018 +0300
Disable linking and preloading of classes those parent or one of interface or trait is an internal class.
commit a594a618ce98242c1d273eb9ede75b4f6b4635d8
Author: Dmitry Stogov <dmitry@zend.com>
Date: Thu Oct 25 22:30:51 2018 +0300
Cleanup
- remove useless ZCSG(saved_map_ptr_last)
- move preloaded classes/functions clean-up code back into better place
commit ab9a40f63cfa1a205b8f853b7e0c2ce61edabb32
Author: Dmitry Stogov <dmitry@zend.com>
Date: Thu Oct 25 20:52:51 2018 +0300
Added support for preloaded classes/functions in ZTS build
commit e3c65db099517082b66dd20ea57e1bda649a7aa5
Merge: 4f57c1e029 33e777acbf
Author: Dmitry Stogov <dmitry@zend.com>
Date: Thu Oct 25 20:52:26 2018 +0300
Merge branch 'master' into preload
* master:
Improved shared interned strings handling. The previous implementation worked incorrectly in ZTS build. It changed strings only in function/class tables of one thread. Now all threads gets the same shared interned strings. Also, on shutdown, we don't try to replace SHM interned strings back to process strings, but delay dettachment of SHM instead.
Don't use request heap at shutdown
Don't optimize function if inference failed
Fixed bug #77058
Improve "narrowing" error message
bump versions
commit 4f57c1e029ce9c24bd699ea61b05973c4665bc32
Author: Dmitry Stogov <dmitry@zend.com>
Date: Thu Oct 25 15:29:58 2018 +0300
Cleanup (move preload_shutdown() call to better place)
commit 26587a95c071cf9dd098199eb3708fca8adae243
Author: Dmitry Stogov <dmitry@zend.com>
Date: Thu Oct 25 14:30:51 2018 +0300
eol
commit d70cb10480fdc7d814495150cd48e43d4147138f
Author: Dmitry Stogov <dmitry@zend.com>
Date: Thu Oct 25 14:30:20 2018 +0300
cleanup
commit aabe685dbb887e91c240b6c5553193889bcfc540
Merge: d9fc51bc3b 40808ac41e
Author: Dmitry Stogov <dmitry@zend.com>
Date: Thu Oct 25 12:42:51 2018 +0300
Merge branch 'master' into preload
* master:
Remove unused var
Remove ext/json parser files generated by bison
Fix run-tests.php for running phpdbg and certain test sections
Normalize .gitignore
commit d9fc51bc3bdfbd7f4149a884b09e3c09a41f7a8d
Merge: b5ffba0faf b6ef8998d5
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 24 15:59:24 2018 +0300
Merge branch 'master' into preload
* master:
Fixed reseting of interned strings buffer.
commit b5ffba0fafb4d940336d5f5fe93950dad1d8d779
Merge: e4a7ef0c43 a404383118
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 24 12:46:28 2018 +0300
Merge branch 'master' into preload
* master:
Fixed build in directory different from source
commit e4a7ef0c431ec97cdd00e44dfa0ef17887d1e5e3
Merge: 811f20aaa5 d1e14e2cc0
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 24 11:59:43 2018 +0300
Merge branch 'master' into preload
* master: (29 commits)
Make php_plain_files_wrapper to be writable (workaround for swoole)
Remove phpdbg parser files generated by bison
Fix conflicts in phpdbg parser
Refetetch function name on exceptional path to allow better code on fast code path.
fix typo in sysvsem.c
Fixed bug #50675
bump to 7.2.13-dev
[ci skip] Update NEWS wrt. php-7.3.0RC4 tagging
Inlining in the most frequently used code paths
Fixed test failurs introduced by 9c144e0d8217d1ef7a83c2498214308b21af749f
Use persistent strings only for persistent connections
Fix accessibility checks for dynamic properties
Updated to version 2018.6 (2018f)
Updated to version 2018.6 (2018f)
Updated to version 2018.6 (2018f)
Fix arginfo and clean up fpm_get_status
Defragment two Zend related Makefile fragments together
[ci skip] Remove automake and aclocal in comments
Fix #75282: xmlrpc_encode_request() crashes
Fix tests for ICU 63.1
...
commit 811f20aaa5030035666d9f325dd7c64632c70a50
Author: Dmitry Stogov <dmitry@zend.com>
Date: Mon Oct 22 14:10:49 2018 +0300
Added information about preloading to opcache_get_status()
commit 093e8b1bbffdc07d217a543613ea14c3eeac710e
Author: Dmitry Stogov <dmitry@zend.com>
Date: Fri Oct 19 13:46:23 2018 +0300
Added warning message
commit a2ba970ce3d0ac51ebfbe1bfc2dc7b99b9750a75
Author: Dmitry Stogov <dmitry@zend.com>
Date: Fri Oct 19 13:35:40 2018 +0300
Added test
commit b67e28367c11db50360e664a7ad6ac95b393f2e4
Author: Dmitry Stogov <dmitry@zend.com>
Date: Fri Oct 19 13:33:12 2018 +0300
Don't preload functions declared at run-time.
commit b0139dc22854ee000586ef83c149d7d25181da60
Merge: a609520adb 3fe698b904
Author: Dmitry Stogov <dmitry@zend.com>
Date: Fri Oct 19 13:23:14 2018 +0300
Merge branch 'master' into preload
* master:
Mark "top-level" functions.
Don't initialize static_member_tables during start-up, when inherit internal classes.
[ci skip] Update NEWS
[ci skip] Update NEWS
[ci skip] Update NEWS
Fix #77035: The phpize and ./configure create redundant .deps file
Remove outdated PEAR artefacts
Fix tests/output/bug74815.phpt generating errors.log
Revert "Use C++ symbols, when C++11 or upper is compiled"
Use C++ symbols, when C++11 or upper is compiled
Added new line
Remove stamp-h
Move all testing docs to qa.php.net
Fix a typo in UPGRADING.INTERNALS
Fix test when it's run on another drive
[ci skip] Update UPGRADING wrt. tidyp support
Fixed incorrect reallocation
Fix #77027: tidy::getOptDoc() not available on Windows
Run CI tests under opcache.protect_memory=1
commit a609520adbc0bf12701d467bae4a016fde43231e
Merge: ac8f45f61b b6ac50f9e6
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 17 17:01:05 2018 +0300
Merge branch 'master' into preload
* master:
Fixed comment
Micro optimizations
Mark "top-level" classes
commit ac8f45f61b561af9aee629232bc3705143ceaac3
Merge: 632b30b545 d57cd36e47
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 17 15:53:41 2018 +0300
Merge branch 'master' into preload
* master:
Immutable clases and op_arrays.
commit 632b30b5451c8fdf0879a3ba4d937ff4ecfc8ce7
Merge: d33908a99a cd0c36c3f9
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 17 15:04:43 2018 +0300
Merge branch 'immutable' into preload
* immutable:
Remove the "auto" encoding
Fixed bug #77025
Add vtbls for EUC-TW encoding
commit cd0c36c3f943849e5b97a8dbe2dd029fbeab3df9
Merge: 4740dabb84 ad6738e886
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 17 14:43:38 2018 +0300
Merge branch 'master' into immutable
* master:
Remove the "auto" encoding
Fixed bug #77025
Add vtbls for EUC-TW encoding
commit d33908a99a3c746f188e268df3db541591f6fcc2
Merge: 21e0bebca3 4740dabb84
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 17 14:14:23 2018 +0300
Merge branch 'immutable' into preload
* immutable:
Reverted back ce->iterator_funcs_ptr. Initialize ce->iterator_funcs_ptr fields in immutable classes.
commit 4740dabb843c6d4f7f866b4a2456073c9eaf4c77
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 17 14:12:28 2018 +0300
Reverted back ce->iterator_funcs_ptr. Initialize ce->iterator_funcs_ptr fields in immutable classes.
commit 21e0bebca3e6fff3c3484ee46f9aa3ac4e98eaeb
Merge: c78277ae84 ad7a78b253
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 17 12:29:59 2018 +0300
Merge branch 'immutable' into preload
* immutable:
Added comment
Added type cast
Moved static class members initialization into the proper place.
Removed redundand assertion
Removed duplicate code
Hide offset encoding magic in ZEND_MAP_PTR_IS_OFFSET(), ZEND_MAP_PTR_OFFSET2PTR() and ZEND_MAP_PTR_PTR2OFFSET() macros.
typo
Remove unused variable makefile_am_files
Classify object handlers are required/optional
Add support for getting SKIP_TAGSTART and SKIP_WHITE options
Remove some obsolete config_vars.mk occurrences
Remove bsd_converted from .gitignore
Remove configuration parser and scanners ignores
Remove obsolete buildconf.stamp from .gitignore
[ci skip] Add magicdata.patch exception to .gitignore
Remove outdated ext/spl/examples items from .gitignore
Remove unused test.inc in ext/iconv/tests
commit ad7a78b253be970db70c2251e66f9297d8e7f829
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 17 11:46:30 2018 +0300
Added comment
commit 0276ea51875bab37be01a4dc5e5a047c5698c571
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 17 11:42:43 2018 +0300
Added type cast
commit c63fc5d5f19c58498108d1698055b2b442227eb3
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 17 11:36:51 2018 +0300
Moved static class members initialization into the proper place.
commit b945548e9306b1826c881918858b5e5aa3eb3002
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 17 11:21:03 2018 +0300
Removed redundand assertion
commit d5a41088401814c829847db212488f8aae39bcd2
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 17 11:19:13 2018 +0300
Removed duplicate code
commit 8dadca8864e66de70a24bdf1181bcf7dd8fb27d7
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 17 11:05:43 2018 +0300
Hide offset encoding magic in ZEND_MAP_PTR_IS_OFFSET(), ZEND_MAP_PTR_OFFSET2PTR() and ZEND_MAP_PTR_PTR2OFFSET() macros.
commit 9ef07c88bd76801e2d4fbfeab3ebfd6e6a67ac5f
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 17 10:48:29 2018 +0300
typo
commit a06f0f3d3aba53e766046221ee44fb9720389ecc
Merge: 94099586ec 3412345ffe
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 17 10:47:07 2018 +0300
Merge branch 'master' into immutable
* master:
Remove unused variable makefile_am_files
Classify object handlers are required/optional
Add support for getting SKIP_TAGSTART and SKIP_WHITE options
Remove some obsolete config_vars.mk occurrences
Remove bsd_converted from .gitignore
Remove configuration parser and scanners ignores
Remove obsolete buildconf.stamp from .gitignore
[ci skip] Add magicdata.patch exception to .gitignore
Remove outdated ext/spl/examples items from .gitignore
Remove unused test.inc in ext/iconv/tests
commit c78277ae84b21067744d1701949e4e1fadd8872a
Author: Dmitry Stogov <dmitry@zend.com>
Date: Tue Oct 16 17:25:35 2018 +0300
Preloadsing support for opcache restart
commit f76a955c02f6a033d4656d5e0d9dad9a8e83cc86
Author: Dmitry Stogov <dmitry@zend.com>
Date: Tue Oct 16 13:52:36 2018 +0300
Fixed incorrect signal handlers overriding
commit 0810ce0d8165d4b752267f035f9fa0aaa1698ceb
Author: Dmitry Stogov <dmitry@zend.com>
Date: Mon Oct 15 23:38:48 2018 +0300
An attempt to implemnt "preloading" ability.
commit 94099586ec599117581ca01c15b1f6c5f749e23a
Author: Dmitry Stogov <dmitry@zend.com>
Date: Mon Oct 15 23:34:01 2018 +0300
Immutable clases and op_arrays
2018-11-14 21:46:05 +08:00
|
|
|
compiler_globals->class_table = NULL;
|
2021-08-26 18:27:25 +08:00
|
|
|
if (compiler_globals->map_ptr_real_base) {
|
|
|
|
free(compiler_globals->map_ptr_real_base);
|
2020-01-13 19:27:35 +08:00
|
|
|
}
|
2021-08-26 18:27:25 +08:00
|
|
|
compiler_globals->map_ptr_real_base = NULL;
|
|
|
|
compiler_globals->map_ptr_base = ZEND_MAP_PTR_BIASED_BASE(NULL);
|
2024-09-07 07:45:26 +08:00
|
|
|
if (compiler_globals->internal_run_time_cache) {
|
|
|
|
pefree(compiler_globals->internal_run_time_cache, 1);
|
|
|
|
}
|
|
|
|
compiler_globals->internal_run_time_cache = NULL;
|
2012-05-03 22:39:53 +08:00
|
|
|
if ((script_encoding_list = (zend_encoding **)compiler_globals->script_encoding_list)) {
|
2014-12-14 06:06:14 +08:00
|
|
|
compiler_globals_ctor(compiler_globals);
|
2012-05-03 22:39:53 +08:00
|
|
|
compiler_globals->script_encoding_list = (const zend_encoding **)script_encoding_list;
|
|
|
|
} else {
|
2014-12-14 06:06:14 +08:00
|
|
|
compiler_globals_ctor(compiler_globals);
|
2012-05-03 22:39:53 +08:00
|
|
|
}
|
2003-12-12 18:50:23 +08:00
|
|
|
free(EG(zend_constants));
|
Implemented preloading RFC: https://wiki.php.net/rfc/preload.
Squashed commit of the following:
commit 106c815fffb8eb3efe00a27a5229cb1f8ffc9736
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Nov 14 16:36:44 2018 +0300
Added NEWS entry
commit 1dacd5e20b7043368ef9e80db296d1781134b6fd
Merge: d516139abf ba99aa133c
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Nov 14 16:33:37 2018 +0300
Merge branch 'master' into preload
* master:
Fixed issues related to optimization and persitence of classes linked with interfaces, traits or internal classes.
Added possiblity to avoid signal handlers reinitialization on each request.
commit d516139abf5ffbd495ee6037f1dc04a1cfe588a7
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Nov 14 16:13:15 2018 +0300
Override opcache.preload for testing
commit 162b154d0bbfbaf8ef93975f7e56a1353236903d
Merge: 45fdd034ce 8bda22592e
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Nov 14 15:38:09 2018 +0300
Merge branch 'master' into preload
* master: (34 commits)
Eliminate useless $this related check
Eliminate useless $this related checks
Replace zend_parse_method_parameters() by zend_parse_parameters() and avoid useless checks.
Replace getThis() by EX(This), when additional check is not necessary.
Fixed tests
Validate length on socket_write
Fix compilation on x32
Fix #77141: Signedness issue in SOAP when precision=-1
Support SQLite3 @name notation
Remove lexer files generated by RE2C
Update libmagic.patch [ci skip]
Update libmagic.patch [ci skip]
Fork test with pcre.jit=0
Rework magic data
Fix regex
Fix regex
Rework magic data
Sync one more upstream libmagic piece
Suppress already used warning
Ignore getaddrinfo failed message
...
commit 45fdd034ceceb68e8fb23bd6e70d627f17dfd411
Author: Dmitry Stogov <dmitry@zend.com>
Date: Fri Nov 9 13:07:03 2018 +0300
Properly resolve magic method of preloaded classes inherited from internal ones.
commit 34645aeb4272b71a81a7e0d91f27eded557b78be
Author: Dmitry Stogov <dmitry@zend.com>
Date: Thu Nov 8 15:29:17 2018 +0300
Don't preload constants defined during preload script excution.
commit cef0d67c3e5aac89b3d606fbd8d445225c07c83f
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Nov 7 15:56:54 2018 +0300
Support for class aliasses
commit 08ffc9a552c7cf4fbff1a4b3d2de4e7c33f4120d
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Nov 7 15:34:39 2018 +0300
Resolve constants only in linked classes
commit 8d3429cda83c87646eef0006d5cda075f2400b24
Author: Dmitry Stogov <dmitry@zend.com>
Date: Tue Nov 6 11:56:39 2018 +0300
Fixed preloading of references to internal classes.
commit 7ae3a47d20e83f7d804506c6d50f6a392199260b
Merge: 9b0a53ed1c 049f239cfc
Author: Dmitry Stogov <dmitry@zend.com>
Date: Tue Nov 6 11:37:15 2018 +0300
Merge branch 'master' into preload
* master:
Update NEWS [ci skip]
Update NEWS [ci skip]
Update libmagic.patch [ci skip]
Update libmagic.patch [ci skip]
Declare function proto in header
Declare function proto in header
Fix #76825: Undefined symbols ___cpuid_count
NEWS
Fix: #77110 undefined symbol zend_string_equal_val in C++ build
Fix #77105: Use position:sticky for <th> in `phpinfo()`
Implement handling for JIT recognition when cross compiling
Backport 7f5f4601 for 7.2
Fix #76348: WSDL_CACHE_MEMORY causes Segmentation fault
Rework places in libmagic regarding previous CVE-2014-3538 fixes
Change the way JIT availability is checked
Fix a test for ldap extension
Fixed bug #77092
Future-proof email addresses
commit 9b0a53ed1cd5995efae0d71e1941d1db4ef6ba39
Author: Dmitry Stogov <dmitry@zend.com>
Date: Fri Nov 2 14:54:44 2018 +0300
We don't need preload_restart() here
commit 0bd17bd43890423e1e98a5925f11cea93da3df55
Author: Dmitry Stogov <dmitry@zend.com>
Date: Fri Nov 2 14:44:30 2018 +0300
EG(*) may be not initializd at this point - use CG(*).
commit b610467051d8a3687a60ffc2957bc353cb6b3bd4
Merge: 3a9d90f74a 67e0138c0d
Author: Dmitry Stogov <dmitry@zend.com>
Date: Fri Nov 2 11:33:37 2018 +0300
Merge branch 'master' into preload
* master:
Future-proof email addresses...
Update email addresses. We're still @Zend, but future proofing it...
commit 3a9d90f74a3d890cb59658d604d5a202e3aee256
Author: Dmitry Stogov <dmitry@zend.com>
Date: Thu Nov 1 15:19:48 2018 +0300
Fexed resolution of method clones
commit aea85c65bd1795d0750dee6ac0e476acd2ac9dd7
Author: Dmitry Stogov <dmitry@zend.com>
Date: Thu Nov 1 11:45:50 2018 +0300
Prevent inlining of method copied from trait
commit 36b644fbb738e7548ccb436e5d04d653d93cce14
Merge: 7a20781d2e b91690c892
Author: Dmitry Stogov <dmitry@zend.com>
Date: Thu Nov 1 10:56:02 2018 +0300
Merge branch 'master' into preload
* master:
Fix stray newline that caused this test to fail
Fix session tests that fail if error_log is set
This test needs to log to stdout
Fix error condition
Fixed bug #77081 ftruncate() changes seek pointer in c mode
Fix and improve test case
commit 7a20781d2ee694262f913a612d8b0b6a24ceff7b
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 31 00:52:46 2018 +0300
Added test
commit 4a57b5d563f9c9616f3c236f57ccd09d8a66f146
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 31 00:50:21 2018 +0300
Fixed preloading of classes linked with traits
commit 68c4f99e23695e74eafa43097ecab62392bad3ee
Author: Dmitry Stogov <dmitry@zend.com>
Date: Tue Oct 30 16:25:14 2018 +0300
Added test
commit 38ab7ef4cf429dcfd5dfb18f844242cdf3a4d61f
Merge: eb6e2c529f bf38e6c10a
Author: Dmitry Stogov <dmitry@zend.com>
Date: Tue Oct 30 16:14:39 2018 +0300
Merge branch 'master' into preload
* master:
Keep original value of "prototype"
commit eb6e2c529f8cedf6823346387dd8b0ba6a4f045b
Merge: 562049510f 2fefa8c61e
Author: Dmitry Stogov <dmitry@zend.com>
Date: Tue Oct 30 15:35:39 2018 +0300
Merge branch 'master' into preload
* master:
Call function_add_ref() in proper place
Updated to version 2018.7 (2018g)
Updated to version 2018.7 (2018g)
Updated to version 2018.7 (2018g)
Reslove inherited op_array references once afrer all optimizations.
commit 562049510f605c21cd46fc3b6f97ed15bfe7b0dc
Merge: e806cb732a 4828fb7b6b
Author: Dmitry Stogov <dmitry@zend.com>
Date: Tue Oct 30 10:29:49 2018 +0300
Merge branch 'master' into preload
* master:
[ci skip] Update NEWS
[ci skip] Update NEWS
[ci skip] Update NEWS
fix bug #77079
Add missing null initialization
Remove redundant mbfl_string_init calls
Use zend_string for mbstring last encoding cache
commit e806cb732a2a3f1e409528988a0571421c541078
Author: Dmitry Stogov <dmitry@zend.com>
Date: Mon Oct 29 22:32:15 2018 +0300
Fixed double-free
commit 2f697ef8af0e7b21c47707b2d688880e8c987a8b
Author: Dmitry Stogov <dmitry@zend.com>
Date: Mon Oct 29 22:07:32 2018 +0300
typo
commit c559f22b3e61b38761831d9610889d28ba6875e0
Merge: 310631cc05 ea2e67876a
Author: Dmitry Stogov <dmitry@zend.com>
Date: Mon Oct 29 21:59:27 2018 +0300
Merge branch 'master' into preload
* master:
Stop Apache if PHP wasn't started successful.
Execute zend_post_startup() with module_initialized flag set.
Removed dead code
Fix mb_strrpos() with encoding passed as 3rd param
commit 310631cc0565ac87091c4f1a8a9f739a13e7e778
Author: Dmitry Stogov <dmitry@zend.com>
Date: Mon Oct 29 16:48:42 2018 +0300
Stop Apache if PHP wasn't started successful.
commit 0a24d7ba8f3280507c9663b32e14030212cf8491
Author: Dmitry Stogov <dmitry@zend.com>
Date: Mon Oct 29 16:25:49 2018 +0300
Avoid use-after-free in main thread
commit 17a3cb4a2ab271c2b2357c04e36efa64e02444ff
Author: Dmitry Stogov <dmitry@zend.com>
Date: Mon Oct 29 15:25:17 2018 +0300
Execute zend_post_startup() with module_initialized flag set.
commit 6d4b22c518bec956e9632fad4329360304d17fd7
Author: Dmitry Stogov <dmitry@zend.com>
Date: Mon Oct 29 14:12:20 2018 +0300
Override SAPI.ub_write and SAPI.flush for preloading
commit 386c9d3470168f70afe5d3b72a58ea0c0da1519c
Merge: d7fbb4d402 359f19edc9
Author: Dmitry Stogov <dmitry@zend.com>
Date: Mon Oct 29 13:49:24 2018 +0300
Merge branch 'master' into preload
* master:
Optimize substr() edge-case conditions
[ci skip] Update UPGRADING
Fix #71592: External entity processing never fails
Add TIDY_TAG_* constants supported by libtidy 5
Add is_iterable to opcache Optimizer
commit d7fbb4d402a18c8fd1c49e0c92afd9f9e513bc7a
Author: Dmitry Stogov <dmitry@zend.com>
Date: Fri Oct 26 13:11:54 2018 +0300
Restore preload state if it was already loaded in another process.
commit 0fe9ea1c07822b5d4672cece2c180bf9795e16e4
Author: Dmitry Stogov <dmitry@zend.com>
Date: Fri Oct 26 12:29:06 2018 +0300
Removed dead code
commit 3a2d1bcc1fd27b6983522c262931fc0187c0afef
Author: Dmitry Stogov <dmitry@zend.com>
Date: Fri Oct 26 00:19:40 2018 +0300
Support for builds without ZEND_SIGNALS
commit e6b76ecb4beea3b922bf7529050e3828f745dedb
Merge: 4531fbf931 68694c9997
Author: Dmitry Stogov <dmitry@zend.com>
Date: Thu Oct 25 23:43:25 2018 +0300
Merge branch 'master' into preload
* master:
Don't wrap php_module_shutdown() with zend_try. executor_globals are released in ZTS build, and this leads to crash.
[ci skip] Fix indentation in UPGRADING.
commit 4531fbf9310bfb7bb579134cc84e8c10c5d42059
Author: Dmitry Stogov <dmitry@zend.com>
Date: Thu Oct 25 22:44:49 2018 +0300
Disable linking and preloading of classes those parent or one of interface or trait is an internal class.
commit a594a618ce98242c1d273eb9ede75b4f6b4635d8
Author: Dmitry Stogov <dmitry@zend.com>
Date: Thu Oct 25 22:30:51 2018 +0300
Cleanup
- remove useless ZCSG(saved_map_ptr_last)
- move preloaded classes/functions clean-up code back into better place
commit ab9a40f63cfa1a205b8f853b7e0c2ce61edabb32
Author: Dmitry Stogov <dmitry@zend.com>
Date: Thu Oct 25 20:52:51 2018 +0300
Added support for preloaded classes/functions in ZTS build
commit e3c65db099517082b66dd20ea57e1bda649a7aa5
Merge: 4f57c1e029 33e777acbf
Author: Dmitry Stogov <dmitry@zend.com>
Date: Thu Oct 25 20:52:26 2018 +0300
Merge branch 'master' into preload
* master:
Improved shared interned strings handling. The previous implementation worked incorrectly in ZTS build. It changed strings only in function/class tables of one thread. Now all threads gets the same shared interned strings. Also, on shutdown, we don't try to replace SHM interned strings back to process strings, but delay dettachment of SHM instead.
Don't use request heap at shutdown
Don't optimize function if inference failed
Fixed bug #77058
Improve "narrowing" error message
bump versions
commit 4f57c1e029ce9c24bd699ea61b05973c4665bc32
Author: Dmitry Stogov <dmitry@zend.com>
Date: Thu Oct 25 15:29:58 2018 +0300
Cleanup (move preload_shutdown() call to better place)
commit 26587a95c071cf9dd098199eb3708fca8adae243
Author: Dmitry Stogov <dmitry@zend.com>
Date: Thu Oct 25 14:30:51 2018 +0300
eol
commit d70cb10480fdc7d814495150cd48e43d4147138f
Author: Dmitry Stogov <dmitry@zend.com>
Date: Thu Oct 25 14:30:20 2018 +0300
cleanup
commit aabe685dbb887e91c240b6c5553193889bcfc540
Merge: d9fc51bc3b 40808ac41e
Author: Dmitry Stogov <dmitry@zend.com>
Date: Thu Oct 25 12:42:51 2018 +0300
Merge branch 'master' into preload
* master:
Remove unused var
Remove ext/json parser files generated by bison
Fix run-tests.php for running phpdbg and certain test sections
Normalize .gitignore
commit d9fc51bc3bdfbd7f4149a884b09e3c09a41f7a8d
Merge: b5ffba0faf b6ef8998d5
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 24 15:59:24 2018 +0300
Merge branch 'master' into preload
* master:
Fixed reseting of interned strings buffer.
commit b5ffba0fafb4d940336d5f5fe93950dad1d8d779
Merge: e4a7ef0c43 a404383118
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 24 12:46:28 2018 +0300
Merge branch 'master' into preload
* master:
Fixed build in directory different from source
commit e4a7ef0c431ec97cdd00e44dfa0ef17887d1e5e3
Merge: 811f20aaa5 d1e14e2cc0
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 24 11:59:43 2018 +0300
Merge branch 'master' into preload
* master: (29 commits)
Make php_plain_files_wrapper to be writable (workaround for swoole)
Remove phpdbg parser files generated by bison
Fix conflicts in phpdbg parser
Refetetch function name on exceptional path to allow better code on fast code path.
fix typo in sysvsem.c
Fixed bug #50675
bump to 7.2.13-dev
[ci skip] Update NEWS wrt. php-7.3.0RC4 tagging
Inlining in the most frequently used code paths
Fixed test failurs introduced by 9c144e0d8217d1ef7a83c2498214308b21af749f
Use persistent strings only for persistent connections
Fix accessibility checks for dynamic properties
Updated to version 2018.6 (2018f)
Updated to version 2018.6 (2018f)
Updated to version 2018.6 (2018f)
Fix arginfo and clean up fpm_get_status
Defragment two Zend related Makefile fragments together
[ci skip] Remove automake and aclocal in comments
Fix #75282: xmlrpc_encode_request() crashes
Fix tests for ICU 63.1
...
commit 811f20aaa5030035666d9f325dd7c64632c70a50
Author: Dmitry Stogov <dmitry@zend.com>
Date: Mon Oct 22 14:10:49 2018 +0300
Added information about preloading to opcache_get_status()
commit 093e8b1bbffdc07d217a543613ea14c3eeac710e
Author: Dmitry Stogov <dmitry@zend.com>
Date: Fri Oct 19 13:46:23 2018 +0300
Added warning message
commit a2ba970ce3d0ac51ebfbe1bfc2dc7b99b9750a75
Author: Dmitry Stogov <dmitry@zend.com>
Date: Fri Oct 19 13:35:40 2018 +0300
Added test
commit b67e28367c11db50360e664a7ad6ac95b393f2e4
Author: Dmitry Stogov <dmitry@zend.com>
Date: Fri Oct 19 13:33:12 2018 +0300
Don't preload functions declared at run-time.
commit b0139dc22854ee000586ef83c149d7d25181da60
Merge: a609520adb 3fe698b904
Author: Dmitry Stogov <dmitry@zend.com>
Date: Fri Oct 19 13:23:14 2018 +0300
Merge branch 'master' into preload
* master:
Mark "top-level" functions.
Don't initialize static_member_tables during start-up, when inherit internal classes.
[ci skip] Update NEWS
[ci skip] Update NEWS
[ci skip] Update NEWS
Fix #77035: The phpize and ./configure create redundant .deps file
Remove outdated PEAR artefacts
Fix tests/output/bug74815.phpt generating errors.log
Revert "Use C++ symbols, when C++11 or upper is compiled"
Use C++ symbols, when C++11 or upper is compiled
Added new line
Remove stamp-h
Move all testing docs to qa.php.net
Fix a typo in UPGRADING.INTERNALS
Fix test when it's run on another drive
[ci skip] Update UPGRADING wrt. tidyp support
Fixed incorrect reallocation
Fix #77027: tidy::getOptDoc() not available on Windows
Run CI tests under opcache.protect_memory=1
commit a609520adbc0bf12701d467bae4a016fde43231e
Merge: ac8f45f61b b6ac50f9e6
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 17 17:01:05 2018 +0300
Merge branch 'master' into preload
* master:
Fixed comment
Micro optimizations
Mark "top-level" classes
commit ac8f45f61b561af9aee629232bc3705143ceaac3
Merge: 632b30b545 d57cd36e47
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 17 15:53:41 2018 +0300
Merge branch 'master' into preload
* master:
Immutable clases and op_arrays.
commit 632b30b5451c8fdf0879a3ba4d937ff4ecfc8ce7
Merge: d33908a99a cd0c36c3f9
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 17 15:04:43 2018 +0300
Merge branch 'immutable' into preload
* immutable:
Remove the "auto" encoding
Fixed bug #77025
Add vtbls for EUC-TW encoding
commit cd0c36c3f943849e5b97a8dbe2dd029fbeab3df9
Merge: 4740dabb84 ad6738e886
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 17 14:43:38 2018 +0300
Merge branch 'master' into immutable
* master:
Remove the "auto" encoding
Fixed bug #77025
Add vtbls for EUC-TW encoding
commit d33908a99a3c746f188e268df3db541591f6fcc2
Merge: 21e0bebca3 4740dabb84
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 17 14:14:23 2018 +0300
Merge branch 'immutable' into preload
* immutable:
Reverted back ce->iterator_funcs_ptr. Initialize ce->iterator_funcs_ptr fields in immutable classes.
commit 4740dabb843c6d4f7f866b4a2456073c9eaf4c77
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 17 14:12:28 2018 +0300
Reverted back ce->iterator_funcs_ptr. Initialize ce->iterator_funcs_ptr fields in immutable classes.
commit 21e0bebca3e6fff3c3484ee46f9aa3ac4e98eaeb
Merge: c78277ae84 ad7a78b253
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 17 12:29:59 2018 +0300
Merge branch 'immutable' into preload
* immutable:
Added comment
Added type cast
Moved static class members initialization into the proper place.
Removed redundand assertion
Removed duplicate code
Hide offset encoding magic in ZEND_MAP_PTR_IS_OFFSET(), ZEND_MAP_PTR_OFFSET2PTR() and ZEND_MAP_PTR_PTR2OFFSET() macros.
typo
Remove unused variable makefile_am_files
Classify object handlers are required/optional
Add support for getting SKIP_TAGSTART and SKIP_WHITE options
Remove some obsolete config_vars.mk occurrences
Remove bsd_converted from .gitignore
Remove configuration parser and scanners ignores
Remove obsolete buildconf.stamp from .gitignore
[ci skip] Add magicdata.patch exception to .gitignore
Remove outdated ext/spl/examples items from .gitignore
Remove unused test.inc in ext/iconv/tests
commit ad7a78b253be970db70c2251e66f9297d8e7f829
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 17 11:46:30 2018 +0300
Added comment
commit 0276ea51875bab37be01a4dc5e5a047c5698c571
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 17 11:42:43 2018 +0300
Added type cast
commit c63fc5d5f19c58498108d1698055b2b442227eb3
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 17 11:36:51 2018 +0300
Moved static class members initialization into the proper place.
commit b945548e9306b1826c881918858b5e5aa3eb3002
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 17 11:21:03 2018 +0300
Removed redundand assertion
commit d5a41088401814c829847db212488f8aae39bcd2
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 17 11:19:13 2018 +0300
Removed duplicate code
commit 8dadca8864e66de70a24bdf1181bcf7dd8fb27d7
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 17 11:05:43 2018 +0300
Hide offset encoding magic in ZEND_MAP_PTR_IS_OFFSET(), ZEND_MAP_PTR_OFFSET2PTR() and ZEND_MAP_PTR_PTR2OFFSET() macros.
commit 9ef07c88bd76801e2d4fbfeab3ebfd6e6a67ac5f
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 17 10:48:29 2018 +0300
typo
commit a06f0f3d3aba53e766046221ee44fb9720389ecc
Merge: 94099586ec 3412345ffe
Author: Dmitry Stogov <dmitry@zend.com>
Date: Wed Oct 17 10:47:07 2018 +0300
Merge branch 'master' into immutable
* master:
Remove unused variable makefile_am_files
Classify object handlers are required/optional
Add support for getting SKIP_TAGSTART and SKIP_WHITE options
Remove some obsolete config_vars.mk occurrences
Remove bsd_converted from .gitignore
Remove configuration parser and scanners ignores
Remove obsolete buildconf.stamp from .gitignore
[ci skip] Add magicdata.patch exception to .gitignore
Remove outdated ext/spl/examples items from .gitignore
Remove unused test.inc in ext/iconv/tests
commit c78277ae84b21067744d1701949e4e1fadd8872a
Author: Dmitry Stogov <dmitry@zend.com>
Date: Tue Oct 16 17:25:35 2018 +0300
Preloadsing support for opcache restart
commit f76a955c02f6a033d4656d5e0d9dad9a8e83cc86
Author: Dmitry Stogov <dmitry@zend.com>
Date: Tue Oct 16 13:52:36 2018 +0300
Fixed incorrect signal handlers overriding
commit 0810ce0d8165d4b752267f035f9fa0aaa1698ceb
Author: Dmitry Stogov <dmitry@zend.com>
Date: Mon Oct 15 23:38:48 2018 +0300
An attempt to implemnt "preloading" ability.
commit 94099586ec599117581ca01c15b1f6c5f749e23a
Author: Dmitry Stogov <dmitry@zend.com>
Date: Mon Oct 15 23:34:01 2018 +0300
Immutable clases and op_arrays
2018-11-14 21:46:05 +08:00
|
|
|
EG(zend_constants) = NULL;
|
2013-10-17 16:40:43 +08:00
|
|
|
|
2014-12-14 06:06:14 +08:00
|
|
|
executor_globals_ctor(executor_globals);
|
2005-09-12 17:06:15 +08:00
|
|
|
global_persistent_list = &EG(persistent_list);
|
2014-12-14 06:06:14 +08:00
|
|
|
zend_copy_ini_directives();
|
2018-10-17 20:52:50 +08:00
|
|
|
#else
|
|
|
|
global_map_ptr_last = CG(map_ptr_last);
|
2002-09-17 20:42:11 +08:00
|
|
|
#endif
|
2017-10-18 22:18:54 +08:00
|
|
|
|
2022-12-17 00:44:26 +08:00
|
|
|
#ifdef ZEND_CHECK_STACK_LIMIT
|
|
|
|
zend_call_stack_init();
|
|
|
|
#endif
|
2024-02-21 23:33:33 +08:00
|
|
|
gc_init();
|
2022-12-17 00:44:26 +08:00
|
|
|
|
2017-10-18 22:18:54 +08:00
|
|
|
return SUCCESS;
|
2007-11-03 03:40:39 +08:00
|
|
|
}
|
|
|
|
/* }}} */
|
2002-09-17 20:42:11 +08:00
|
|
|
|
2014-12-14 06:06:14 +08:00
|
|
|
void zend_shutdown(void) /* {{{ */
|
1999-04-08 02:10:10 +08:00
|
|
|
{
|
2018-02-19 21:42:02 +08:00
|
|
|
zend_vm_dtor();
|
|
|
|
|
2014-12-14 06:06:14 +08:00
|
|
|
zend_destroy_rsrc_list(&EG(persistent_list));
|
Fix ZTS crashes with persistent resources in modules (#13381)
On shutdown in ZTS the following happens:
- https://github.com/php/php-src/blob/master/Zend/zend.c#L1124-L1125
gets executed. This destroys global persistent resources and destroys
the modules. Furthermore, the modules are unloaded too.
- Further down, `ts_free_id(executor_globals_id)` gets executed, which
calls `executor_globals_dtor`. This function destroys persistent
resources for each thread.
Notice that in the last step, the modules that the persistent resource
belong to may already have been destroyed. This means that accessing
globals will cause a crash (I previously fixed this with ifdef magic),
or when the module is dynamically loaded we'll try jumping to a
destructor that is no longer loaded in memory. These scenarios cause
crashes.
It's not possible to move the `ts_free_id` call upwards, because that
may break assumptions of callers, and furthermore this would deallocate
the executor globals structure, which means that any access to those
will cause a segfault.
This patch adds a new API to the TSRM that allows running a callback on
a certain resource type. We use this API to destroy the persistent
resources in all threads prior to the module destruction, and keep the
rest of the resource dtor intact.
I verified this fix on Apache with postgres, both dynamically and
statically.
Fixes GH-12974.
2024-02-14 04:43:03 +08:00
|
|
|
#ifdef ZTS
|
|
|
|
ts_apply_for_id(executor_globals_id, executor_globals_persistent_list_dtor);
|
|
|
|
#endif
|
2010-07-06 19:40:17 +08:00
|
|
|
zend_destroy_modules();
|
2001-12-24 02:39:52 +08:00
|
|
|
|
2014-12-14 06:06:14 +08:00
|
|
|
virtual_cwd_deactivate();
|
2014-09-02 06:08:02 +08:00
|
|
|
virtual_cwd_shutdown();
|
2013-10-17 16:40:43 +08:00
|
|
|
|
1999-04-21 11:49:09 +08:00
|
|
|
zend_hash_destroy(GLOBAL_FUNCTION_TABLE);
|
2021-04-30 02:31:24 +08:00
|
|
|
/* Child classes may reuse structures from parent classes, so destroy in reverse order. */
|
|
|
|
zend_hash_graceful_reverse_destroy(GLOBAL_CLASS_TABLE);
|
2001-12-24 02:39:52 +08:00
|
|
|
|
2024-02-07 00:02:00 +08:00
|
|
|
zend_flf_capacity = 0;
|
|
|
|
zend_flf_count = 0;
|
|
|
|
free(zend_flf_functions);
|
|
|
|
free(zend_flf_handlers);
|
|
|
|
zend_flf_functions = NULL;
|
|
|
|
zend_flf_handlers = NULL;
|
|
|
|
|
2001-08-09 01:18:16 +08:00
|
|
|
zend_hash_destroy(GLOBAL_AUTO_GLOBALS_TABLE);
|
|
|
|
free(GLOBAL_AUTO_GLOBALS_TABLE);
|
2005-01-10 00:18:39 +08:00
|
|
|
|
2014-12-14 06:06:14 +08:00
|
|
|
zend_shutdown_extensions();
|
1999-04-08 02:10:10 +08:00
|
|
|
free(zend_version_info);
|
2003-04-19 02:40:53 +08:00
|
|
|
|
2003-12-12 19:14:44 +08:00
|
|
|
free(GLOBAL_FUNCTION_TABLE);
|
|
|
|
free(GLOBAL_CLASS_TABLE);
|
2005-09-12 17:06:15 +08:00
|
|
|
|
2003-04-19 02:40:53 +08:00
|
|
|
zend_hash_destroy(GLOBAL_CONSTANTS_TABLE);
|
2003-12-12 16:25:58 +08:00
|
|
|
free(GLOBAL_CONSTANTS_TABLE);
|
2006-12-06 17:52:51 +08:00
|
|
|
zend_shutdown_strtod();
|
2020-06-05 16:36:35 +08:00
|
|
|
zend_attributes_shutdown();
|
2007-11-03 03:40:39 +08:00
|
|
|
|
2005-09-12 17:06:15 +08:00
|
|
|
#ifdef ZTS
|
2003-12-12 18:50:23 +08:00
|
|
|
GLOBAL_FUNCTION_TABLE = NULL;
|
|
|
|
GLOBAL_CLASS_TABLE = NULL;
|
|
|
|
GLOBAL_AUTO_GLOBALS_TABLE = NULL;
|
2005-09-12 17:06:15 +08:00
|
|
|
GLOBAL_CONSTANTS_TABLE = NULL;
|
2018-10-26 01:30:51 +08:00
|
|
|
ts_free_id(executor_globals_id);
|
|
|
|
ts_free_id(compiler_globals_id);
|
2018-10-17 20:52:50 +08:00
|
|
|
#else
|
2021-08-26 18:27:25 +08:00
|
|
|
if (CG(map_ptr_real_base)) {
|
|
|
|
free(CG(map_ptr_real_base));
|
|
|
|
CG(map_ptr_real_base) = NULL;
|
|
|
|
CG(map_ptr_base) = ZEND_MAP_PTR_BIASED_BASE(NULL);
|
2018-10-17 20:52:50 +08:00
|
|
|
CG(map_ptr_size) = 0;
|
|
|
|
}
|
2020-07-15 23:17:22 +08:00
|
|
|
if (CG(script_encoding_list)) {
|
2020-07-23 04:57:05 +08:00
|
|
|
free(ZEND_VOIDP(CG(script_encoding_list)));
|
2020-07-15 23:17:22 +08:00
|
|
|
CG(script_encoding_list) = NULL;
|
|
|
|
CG(script_encoding_list_size) = 0;
|
|
|
|
}
|
2024-10-20 20:13:45 +08:00
|
|
|
if (CG(internal_run_time_cache)) {
|
|
|
|
pefree(CG(internal_run_time_cache), 1);
|
|
|
|
CG(internal_run_time_cache) = NULL;
|
|
|
|
}
|
2003-04-19 17:04:15 +08:00
|
|
|
#endif
|
2024-09-07 07:45:26 +08:00
|
|
|
zend_map_ptr_static_last = 0;
|
|
|
|
zend_map_ptr_static_size = 0;
|
|
|
|
|
2004-03-15 04:11:13 +08:00
|
|
|
zend_destroy_rsrc_list_dtors();
|
2021-01-26 22:53:49 +08:00
|
|
|
|
2024-02-14 04:55:24 +08:00
|
|
|
zend_unload_modules();
|
|
|
|
|
2021-01-26 22:53:49 +08:00
|
|
|
zend_optimizer_shutdown();
|
2021-08-11 16:28:52 +08:00
|
|
|
startup_done = false;
|
1999-04-08 02:10:10 +08:00
|
|
|
}
|
2007-11-03 03:40:39 +08:00
|
|
|
/* }}} */
|
1999-04-08 02:10:10 +08:00
|
|
|
|
2007-11-03 03:40:39 +08:00
|
|
|
void zend_set_utility_values(zend_utility_values *utility_values) /* {{{ */
|
1999-04-10 19:21:55 +08:00
|
|
|
{
|
|
|
|
zend_uv = *utility_values;
|
|
|
|
}
|
2007-11-03 03:40:39 +08:00
|
|
|
/* }}} */
|
1999-04-10 19:21:55 +08:00
|
|
|
|
1999-04-08 02:10:10 +08:00
|
|
|
/* this should be compatible with the standard zenderror */
|
2015-08-19 19:40:56 +08:00
|
|
|
ZEND_COLD void zenderror(const char *error) /* {{{ */
|
1999-04-08 02:10:10 +08:00
|
|
|
{
|
2017-09-24 14:53:27 +08:00
|
|
|
CG(parse_error) = 0;
|
|
|
|
|
2015-03-22 03:10:19 +08:00
|
|
|
if (EG(exception)) {
|
|
|
|
/* An exception was thrown in the lexer, don't throw another in the parser. */
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2015-07-08 05:54:39 +08:00
|
|
|
zend_throw_exception(zend_ce_parse_error, error, 0);
|
1999-04-08 02:10:10 +08:00
|
|
|
}
|
2007-11-03 03:40:39 +08:00
|
|
|
/* }}} */
|
1999-04-08 02:10:10 +08:00
|
|
|
|
2019-04-12 16:41:53 +08:00
|
|
|
ZEND_API ZEND_COLD ZEND_NORETURN void _zend_bailout(const char *filename, uint32_t lineno) /* {{{ */
|
1999-04-08 02:10:10 +08:00
|
|
|
{
|
2014-10-15 15:37:55 +08:00
|
|
|
|
2006-05-19 14:09:15 +08:00
|
|
|
if (!EG(bailout)) {
|
2001-07-22 00:21:22 +08:00
|
|
|
zend_output_debug_string(1, "%s(%d) : Bailed out without a bailout address!", filename, lineno);
|
2001-07-21 22:25:27 +08:00
|
|
|
exit(-1);
|
|
|
|
}
|
2018-03-02 16:02:21 +08:00
|
|
|
gc_protect(1);
|
1999-05-12 05:39:48 +08:00
|
|
|
CG(unclean_shutdown) = 1;
|
2011-06-08 06:58:38 +08:00
|
|
|
CG(active_class_entry) = NULL;
|
2014-07-03 05:02:25 +08:00
|
|
|
CG(in_compilation) = 0;
|
2023-04-20 21:41:50 +08:00
|
|
|
CG(memoize_mode) = 0;
|
2002-08-28 22:43:32 +08:00
|
|
|
EG(current_execute_data) = NULL;
|
2008-03-19 05:14:28 +08:00
|
|
|
LONGJMP(*EG(bailout), FAILURE);
|
1999-04-08 02:10:10 +08:00
|
|
|
}
|
2007-11-03 03:40:39 +08:00
|
|
|
/* }}} */
|
1999-04-08 02:10:10 +08:00
|
|
|
|
2021-05-27 18:27:18 +08:00
|
|
|
ZEND_API size_t zend_get_page_size(void)
|
|
|
|
{
|
|
|
|
#ifdef _WIN32
|
|
|
|
SYSTEM_INFO system_info;
|
|
|
|
GetSystemInfo(&system_info);
|
|
|
|
return system_info.dwPageSize;
|
|
|
|
#elif defined(__FreeBSD__)
|
|
|
|
/* This returns the value obtained from
|
|
|
|
* the auxv vector, avoiding a syscall. */
|
|
|
|
return getpagesize();
|
|
|
|
#else
|
|
|
|
return (size_t) sysconf(_SC_PAGESIZE);
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2014-10-13 01:22:03 +08:00
|
|
|
ZEND_API void zend_append_version_info(const zend_extension *extension) /* {{{ */
|
1999-04-08 02:10:10 +08:00
|
|
|
{
|
|
|
|
char *new_info;
|
2016-11-26 22:18:42 +08:00
|
|
|
uint32_t new_info_length;
|
1999-04-08 02:10:10 +08:00
|
|
|
|
2016-11-26 22:18:42 +08:00
|
|
|
new_info_length = (uint32_t)(sizeof(" with v, , by \n")
|
1999-04-08 02:10:10 +08:00
|
|
|
+ strlen(extension->name)
|
|
|
|
+ strlen(extension->version)
|
|
|
|
+ strlen(extension->copyright)
|
2014-10-22 15:25:53 +08:00
|
|
|
+ strlen(extension->author));
|
1999-04-08 02:10:10 +08:00
|
|
|
|
2007-11-03 03:40:39 +08:00
|
|
|
new_info = (char *) malloc(new_info_length + 1);
|
1999-04-08 02:10:10 +08:00
|
|
|
|
2011-08-08 11:08:59 +08:00
|
|
|
snprintf(new_info, new_info_length, " with %s v%s, %s, by %s\n", extension->name, extension->version, extension->copyright, extension->author);
|
1999-04-08 02:10:10 +08:00
|
|
|
|
2007-11-03 03:40:39 +08:00
|
|
|
zend_version_info = (char *) realloc(zend_version_info, zend_version_info_length+new_info_length + 1);
|
2011-08-08 11:08:59 +08:00
|
|
|
strncat(zend_version_info, new_info, new_info_length);
|
1999-04-08 02:10:10 +08:00
|
|
|
zend_version_info_length += new_info_length;
|
|
|
|
free(new_info);
|
|
|
|
}
|
2007-11-03 03:40:39 +08:00
|
|
|
/* }}} */
|
1999-04-08 02:10:10 +08:00
|
|
|
|
2019-05-26 13:53:26 +08:00
|
|
|
ZEND_API const char *get_zend_version(void) /* {{{ */
|
1999-04-08 02:10:10 +08:00
|
|
|
{
|
|
|
|
return zend_version_info;
|
|
|
|
}
|
2007-11-03 03:40:39 +08:00
|
|
|
/* }}} */
|
1999-06-06 04:00:00 +08:00
|
|
|
|
2014-12-14 06:06:14 +08:00
|
|
|
ZEND_API void zend_activate(void) /* {{{ */
|
1999-06-06 04:00:00 +08:00
|
|
|
{
|
2013-11-02 20:32:31 +08:00
|
|
|
#ifdef ZTS
|
2014-12-14 06:06:14 +08:00
|
|
|
virtual_cwd_activate();
|
2013-11-02 20:32:31 +08:00
|
|
|
#endif
|
2014-12-14 06:06:14 +08:00
|
|
|
gc_reset();
|
|
|
|
init_compiler();
|
|
|
|
init_executor();
|
|
|
|
startup_scanner();
|
2018-10-17 20:52:50 +08:00
|
|
|
if (CG(map_ptr_last)) {
|
2024-09-07 07:45:26 +08:00
|
|
|
memset((void **)CG(map_ptr_real_base) + zend_map_ptr_static_size, 0, CG(map_ptr_last) * sizeof(void*));
|
2018-10-17 20:52:50 +08:00
|
|
|
}
|
2024-09-07 07:45:26 +08:00
|
|
|
zend_reset_internal_run_time_cache();
|
2020-09-01 23:57:49 +08:00
|
|
|
zend_observer_activate();
|
1999-06-06 04:00:00 +08:00
|
|
|
}
|
2007-11-03 03:40:39 +08:00
|
|
|
/* }}} */
|
1999-06-06 04:00:00 +08:00
|
|
|
|
2014-12-14 06:06:14 +08:00
|
|
|
void zend_call_destructors(void) /* {{{ */
|
2004-07-25 15:14:49 +08:00
|
|
|
{
|
|
|
|
zend_try {
|
2014-12-14 06:06:14 +08:00
|
|
|
shutdown_destructors();
|
2004-07-25 15:14:49 +08:00
|
|
|
} zend_end_try();
|
|
|
|
}
|
2007-11-03 03:40:39 +08:00
|
|
|
/* }}} */
|
2004-07-25 15:14:49 +08:00
|
|
|
|
2014-12-14 06:06:14 +08:00
|
|
|
ZEND_API void zend_deactivate(void) /* {{{ */
|
1999-06-06 04:00:00 +08:00
|
|
|
{
|
2000-07-12 20:00:17 +08:00
|
|
|
/* we're no longer executing anything */
|
2014-07-03 03:29:53 +08:00
|
|
|
EG(current_execute_data) = NULL;
|
2000-04-24 20:47:07 +08:00
|
|
|
|
2001-07-21 22:25:27 +08:00
|
|
|
zend_try {
|
2014-12-14 06:06:14 +08:00
|
|
|
shutdown_scanner();
|
2001-07-21 22:25:27 +08:00
|
|
|
} zend_end_try();
|
|
|
|
|
2001-07-20 22:20:34 +08:00
|
|
|
/* shutdown_executor() takes care of its own bailout handling */
|
2014-12-14 06:06:14 +08:00
|
|
|
shutdown_executor();
|
2001-07-21 22:25:27 +08:00
|
|
|
|
2016-01-26 15:57:39 +08:00
|
|
|
zend_try {
|
|
|
|
zend_ini_deactivate();
|
|
|
|
} zend_end_try();
|
|
|
|
|
2001-07-21 22:25:27 +08:00
|
|
|
zend_try {
|
2014-12-14 06:06:14 +08:00
|
|
|
shutdown_compiler();
|
2001-07-21 22:25:27 +08:00
|
|
|
} zend_end_try();
|
|
|
|
|
2015-02-22 00:19:06 +08:00
|
|
|
zend_destroy_rsrc_list(&EG(regular_list));
|
|
|
|
|
2023-03-05 06:22:05 +08:00
|
|
|
/* See GH-8646: https://github.com/php/php-src/issues/8646
|
|
|
|
*
|
|
|
|
* Interned strings that hold class entries can get a corresponding slot in map_ptr for the CE cache.
|
|
|
|
* map_ptr works like a bump allocator: there is a counter which increases to allocate the next slot in the map.
|
|
|
|
*
|
|
|
|
* For class name strings in non-opcache we have:
|
|
|
|
* - on startup: permanent + interned
|
|
|
|
* - on request: interned
|
|
|
|
* For class name strings in opcache we have:
|
|
|
|
* - on startup: permanent + interned
|
|
|
|
* - on request: either not interned at all, which we can ignore because they won't get a CE cache entry
|
|
|
|
* or they were already permanent + interned
|
|
|
|
* or we get a new permanent + interned string in the opcache persistence code
|
|
|
|
*
|
|
|
|
* Notice that the map_ptr layout always has the permanent strings first, and the request strings after.
|
|
|
|
* In non-opcache, a request string may get a slot in map_ptr, and that interned request string
|
|
|
|
* gets destroyed at the end of the request. The corresponding map_ptr slot can thereafter never be used again.
|
|
|
|
* This causes map_ptr to keep reallocating to larger and larger sizes.
|
|
|
|
*
|
|
|
|
* We solve it as follows:
|
|
|
|
* We can check whether we had any interned request strings, which only happens in non-opcache.
|
|
|
|
* If we have any, we reset map_ptr to the last permanent string.
|
|
|
|
* We can't lose any permanent strings because of map_ptr's layout.
|
|
|
|
*/
|
|
|
|
if (zend_hash_num_elements(&CG(interned_strings)) > 0) {
|
|
|
|
zend_map_ptr_reset();
|
|
|
|
}
|
|
|
|
|
2008-01-24 18:42:12 +08:00
|
|
|
#if GC_BENCH
|
2023-03-10 22:02:22 +08:00
|
|
|
gc_bench_print();
|
2008-01-24 18:42:12 +08:00
|
|
|
#endif
|
1999-06-06 04:00:00 +08:00
|
|
|
}
|
2007-11-03 03:40:39 +08:00
|
|
|
/* }}} */
|
2000-03-06 03:50:10 +08:00
|
|
|
|
2014-12-14 06:06:14 +08:00
|
|
|
ZEND_API void zend_message_dispatcher(zend_long message, const void *data) /* {{{ */
|
2000-03-06 03:50:10 +08:00
|
|
|
{
|
|
|
|
if (zend_message_dispatcher_p) {
|
2014-12-14 06:06:14 +08:00
|
|
|
zend_message_dispatcher_p(message, data);
|
2000-03-06 03:50:10 +08:00
|
|
|
}
|
|
|
|
}
|
2007-11-03 03:40:39 +08:00
|
|
|
/* }}} */
|
2000-03-06 03:50:10 +08:00
|
|
|
|
2014-09-02 00:57:33 +08:00
|
|
|
ZEND_API zval *zend_get_configuration_directive(zend_string *name) /* {{{ */
|
2000-03-06 03:50:10 +08:00
|
|
|
{
|
2001-01-08 02:39:11 +08:00
|
|
|
if (zend_get_configuration_directive_p) {
|
2014-09-02 00:57:33 +08:00
|
|
|
return zend_get_configuration_directive_p(name);
|
2000-03-06 03:50:10 +08:00
|
|
|
} else {
|
2014-09-02 00:57:33 +08:00
|
|
|
return NULL;
|
2000-03-06 03:50:10 +08:00
|
|
|
}
|
|
|
|
}
|
2007-11-03 03:40:39 +08:00
|
|
|
/* }}} */
|
2000-04-19 23:08:06 +08:00
|
|
|
|
2011-08-02 15:38:23 +08:00
|
|
|
#define SAVE_STACK(stack) do { \
|
|
|
|
if (CG(stack).top) { \
|
|
|
|
memcpy(&stack, &CG(stack), sizeof(zend_stack)); \
|
|
|
|
CG(stack).top = CG(stack).max = 0; \
|
|
|
|
CG(stack).elements = NULL; \
|
|
|
|
} else { \
|
|
|
|
stack.top = 0; \
|
|
|
|
} \
|
|
|
|
} while (0)
|
|
|
|
|
|
|
|
#define RESTORE_STACK(stack) do { \
|
|
|
|
if (stack.top) { \
|
|
|
|
zend_stack_destroy(&CG(stack)); \
|
|
|
|
memcpy(&CG(stack), &stack, sizeof(zend_stack)); \
|
|
|
|
} \
|
|
|
|
} while (0)
|
|
|
|
|
2021-04-23 17:29:55 +08:00
|
|
|
ZEND_API ZEND_COLD void zend_error_zstr_at(
|
2021-04-23 16:47:08 +08:00
|
|
|
int orig_type, zend_string *error_filename, uint32_t error_lineno, zend_string *message)
|
2000-04-19 23:08:06 +08:00
|
|
|
{
|
2019-01-30 22:54:35 +08:00
|
|
|
zval params[4];
|
2014-02-10 14:04:30 +08:00
|
|
|
zval retval;
|
|
|
|
zval orig_user_error_handler;
|
2021-01-15 19:30:54 +08:00
|
|
|
bool in_compilation;
|
2024-08-28 23:28:07 +08:00
|
|
|
zend_class_entry *saved_class_entry = NULL;
|
2015-07-10 08:31:52 +08:00
|
|
|
zend_stack loop_var_stack;
|
2014-08-15 23:10:06 +08:00
|
|
|
zend_stack delayed_oplines_stack;
|
2019-10-10 20:14:36 +08:00
|
|
|
int type = orig_type & E_ALL;
|
2022-03-11 15:50:31 +08:00
|
|
|
bool orig_record_errors;
|
|
|
|
uint32_t orig_num_errors;
|
|
|
|
zend_error_info **orig_errors;
|
|
|
|
zend_result res;
|
2000-04-19 23:08:06 +08:00
|
|
|
|
2021-02-11 19:31:36 +08:00
|
|
|
/* If we're executing a function during SCCP, count any warnings that may be emitted,
|
|
|
|
* but don't perform any other error handling. */
|
|
|
|
if (EG(capture_warnings_during_sccp)) {
|
|
|
|
ZEND_ASSERT(!(type & E_FATAL_ERRORS) && "Fatal error during SCCP");
|
|
|
|
EG(capture_warnings_during_sccp)++;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-04-29 22:37:53 +08:00
|
|
|
if (EG(record_errors)) {
|
|
|
|
zend_error_info *info = emalloc(sizeof(zend_error_info));
|
|
|
|
info->type = type;
|
|
|
|
info->lineno = error_lineno;
|
|
|
|
info->filename = zend_string_copy(error_filename);
|
|
|
|
info->message = zend_string_copy(message);
|
|
|
|
|
|
|
|
/* This is very inefficient for a large number of errors.
|
|
|
|
* Use pow2 realloc if it becomes a problem. */
|
|
|
|
EG(num_errors)++;
|
2021-12-10 22:19:16 +08:00
|
|
|
EG(errors) = erealloc(EG(errors), sizeof(zend_error_info*) * EG(num_errors));
|
2021-04-29 22:37:53 +08:00
|
|
|
EG(errors)[EG(num_errors)-1] = info;
|
|
|
|
}
|
|
|
|
|
2012-09-06 15:26:40 +08:00
|
|
|
/* Report about uncaught exception in case of fatal errors */
|
|
|
|
if (EG(exception)) {
|
2014-07-03 03:29:53 +08:00
|
|
|
zend_execute_data *ex;
|
2014-08-28 06:44:06 +08:00
|
|
|
const zend_op *opline;
|
2014-07-03 03:29:53 +08:00
|
|
|
|
2020-09-10 17:36:04 +08:00
|
|
|
if (type & E_FATAL_ERRORS) {
|
|
|
|
ex = EG(current_execute_data);
|
|
|
|
opline = NULL;
|
|
|
|
while (ex && (!ex->func || !ZEND_USER_CODE(ex->func->type))) {
|
|
|
|
ex = ex->prev_execute_data;
|
|
|
|
}
|
|
|
|
if (ex && ex->opline->opcode == ZEND_HANDLE_EXCEPTION &&
|
|
|
|
EG(opline_before_exception)) {
|
|
|
|
opline = EG(opline_before_exception);
|
|
|
|
}
|
|
|
|
zend_exception_error(EG(exception), E_WARNING);
|
|
|
|
EG(exception) = NULL;
|
|
|
|
if (opline) {
|
|
|
|
ex->opline = opline;
|
|
|
|
}
|
2012-09-06 15:26:40 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-09-14 20:05:54 +08:00
|
|
|
zend_observer_error_notify(type, error_filename, error_lineno, message);
|
2010-04-24 21:32:30 +08:00
|
|
|
|
2000-04-19 23:08:06 +08:00
|
|
|
/* if we don't have a user defined error handler */
|
2014-02-10 14:04:30 +08:00
|
|
|
if (Z_TYPE(EG(user_error_handler)) == IS_UNDEF
|
2008-03-09 05:54:03 +08:00
|
|
|
|| !(EG(user_error_handler_error_reporting) & type)
|
|
|
|
|| EG(error_handling) != EH_NORMAL) {
|
2020-05-29 16:33:22 +08:00
|
|
|
zend_error_cb(orig_type, error_filename, error_lineno, message);
|
2000-04-28 03:38:11 +08:00
|
|
|
} else switch (type) {
|
2000-04-19 23:08:06 +08:00
|
|
|
case E_ERROR:
|
|
|
|
case E_PARSE:
|
|
|
|
case E_CORE_ERROR:
|
|
|
|
case E_CORE_WARNING:
|
|
|
|
case E_COMPILE_ERROR:
|
|
|
|
case E_COMPILE_WARNING:
|
2000-04-28 03:38:11 +08:00
|
|
|
/* The error may not be safe to handle in user-space */
|
2020-05-29 16:33:22 +08:00
|
|
|
zend_error_cb(orig_type, error_filename, error_lineno, message);
|
2000-04-28 03:38:11 +08:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
/* Handle the error in user space */
|
2020-05-29 16:33:22 +08:00
|
|
|
ZVAL_STR_COPY(¶ms[1], message);
|
2014-02-10 14:04:30 +08:00
|
|
|
ZVAL_LONG(¶ms[0], type);
|
2000-04-19 23:08:06 +08:00
|
|
|
|
2000-06-29 06:08:47 +08:00
|
|
|
if (error_filename) {
|
2021-04-23 16:47:08 +08:00
|
|
|
ZVAL_STR_COPY(¶ms[2], error_filename);
|
2014-02-10 14:04:30 +08:00
|
|
|
} else {
|
|
|
|
ZVAL_NULL(¶ms[2]);
|
2000-06-29 06:08:47 +08:00
|
|
|
}
|
2003-01-12 20:39:06 +08:00
|
|
|
|
2014-02-10 14:04:30 +08:00
|
|
|
ZVAL_LONG(¶ms[3], error_lineno);
|
2000-06-29 06:08:47 +08:00
|
|
|
|
2014-02-10 14:04:30 +08:00
|
|
|
ZVAL_COPY_VALUE(&orig_user_error_handler, &EG(user_error_handler));
|
|
|
|
ZVAL_UNDEF(&EG(user_error_handler));
|
2007-10-11 09:03:19 +08:00
|
|
|
|
2021-03-31 11:49:41 +08:00
|
|
|
/* User error handler may include() additional PHP files.
|
|
|
|
* If an error was generated during compilation PHP will compile
|
2019-02-19 00:35:35 +08:00
|
|
|
* such scripts recursively, but some CG() variables may be
|
2007-10-11 09:03:19 +08:00
|
|
|
* inconsistent. */
|
2007-01-12 00:47:32 +08:00
|
|
|
|
2013-09-29 23:58:25 +08:00
|
|
|
in_compilation = CG(in_compilation);
|
2007-01-12 00:47:32 +08:00
|
|
|
if (in_compilation) {
|
|
|
|
saved_class_entry = CG(active_class_entry);
|
|
|
|
CG(active_class_entry) = NULL;
|
2015-07-10 08:31:52 +08:00
|
|
|
SAVE_STACK(loop_var_stack);
|
2014-08-15 23:10:06 +08:00
|
|
|
SAVE_STACK(delayed_oplines_stack);
|
2013-09-29 23:58:25 +08:00
|
|
|
CG(in_compilation) = 0;
|
2007-01-12 00:47:32 +08:00
|
|
|
}
|
|
|
|
|
2022-03-11 15:50:31 +08:00
|
|
|
orig_record_errors = EG(record_errors);
|
|
|
|
orig_num_errors = EG(num_errors);
|
|
|
|
orig_errors = EG(errors);
|
|
|
|
EG(record_errors) = false;
|
|
|
|
EG(num_errors) = 0;
|
|
|
|
EG(errors) = NULL;
|
|
|
|
|
|
|
|
res = call_user_function(CG(function_table), NULL, &orig_user_error_handler, &retval, 4, params);
|
|
|
|
|
|
|
|
EG(record_errors) = orig_record_errors;
|
|
|
|
EG(num_errors) = orig_num_errors;
|
|
|
|
EG(errors) = orig_errors;
|
|
|
|
|
|
|
|
if (res == SUCCESS) {
|
2014-02-10 14:04:30 +08:00
|
|
|
if (Z_TYPE(retval) != IS_UNDEF) {
|
2014-04-30 22:32:42 +08:00
|
|
|
if (Z_TYPE(retval) == IS_FALSE) {
|
2020-05-29 16:33:22 +08:00
|
|
|
zend_error_cb(orig_type, error_filename, error_lineno, message);
|
2004-05-29 01:28:33 +08:00
|
|
|
}
|
2002-11-25 04:15:56 +08:00
|
|
|
zval_ptr_dtor(&retval);
|
|
|
|
}
|
2006-03-28 06:07:38 +08:00
|
|
|
} else if (!EG(exception)) {
|
2000-04-28 03:38:11 +08:00
|
|
|
/* The user error handler failed, use built-in error handler */
|
2020-05-29 16:33:22 +08:00
|
|
|
zend_error_cb(orig_type, error_filename, error_lineno, message);
|
2000-04-28 03:38:11 +08:00
|
|
|
}
|
2003-12-19 22:08:22 +08:00
|
|
|
|
2007-01-12 00:47:32 +08:00
|
|
|
if (in_compilation) {
|
|
|
|
CG(active_class_entry) = saved_class_entry;
|
2015-07-10 08:31:52 +08:00
|
|
|
RESTORE_STACK(loop_var_stack);
|
2014-08-15 23:10:06 +08:00
|
|
|
RESTORE_STACK(delayed_oplines_stack);
|
2013-09-29 23:58:25 +08:00
|
|
|
CG(in_compilation) = 1;
|
2007-01-12 00:47:32 +08:00
|
|
|
}
|
|
|
|
|
2014-02-25 17:35:39 +08:00
|
|
|
zval_ptr_dtor(¶ms[2]);
|
|
|
|
zval_ptr_dtor(¶ms[1]);
|
|
|
|
|
2014-02-10 14:04:30 +08:00
|
|
|
if (Z_TYPE(EG(user_error_handler)) == IS_UNDEF) {
|
|
|
|
ZVAL_COPY_VALUE(&EG(user_error_handler), &orig_user_error_handler);
|
2014-02-25 17:35:39 +08:00
|
|
|
} else {
|
2005-05-14 07:08:43 +08:00
|
|
|
zval_ptr_dtor(&orig_user_error_handler);
|
|
|
|
}
|
2000-04-28 03:38:11 +08:00
|
|
|
break;
|
2000-04-19 23:08:06 +08:00
|
|
|
}
|
2000-04-28 03:38:11 +08:00
|
|
|
|
2002-10-08 05:20:23 +08:00
|
|
|
if (type == E_PARSE) {
|
2013-01-02 12:14:44 +08:00
|
|
|
/* eval() errors do not affect exit_status */
|
|
|
|
if (!(EG(current_execute_data) &&
|
2014-07-07 19:50:44 +08:00
|
|
|
EG(current_execute_data)->func &&
|
|
|
|
ZEND_USER_CODE(EG(current_execute_data)->func->type) &&
|
2013-01-02 12:14:44 +08:00
|
|
|
EG(current_execute_data)->opline->opcode == ZEND_INCLUDE_OR_EVAL &&
|
|
|
|
EG(current_execute_data)->opline->extended_value == ZEND_EVAL)) {
|
|
|
|
EG(exit_status) = 255;
|
|
|
|
}
|
2001-05-07 03:30:31 +08:00
|
|
|
}
|
2000-04-19 23:08:06 +08:00
|
|
|
}
|
2007-11-03 03:40:39 +08:00
|
|
|
/* }}} */
|
2000-04-19 23:08:06 +08:00
|
|
|
|
2020-05-29 16:33:22 +08:00
|
|
|
static ZEND_COLD void zend_error_va_list(
|
2021-04-23 16:47:08 +08:00
|
|
|
int orig_type, zend_string *error_filename, uint32_t error_lineno,
|
2020-05-29 16:33:22 +08:00
|
|
|
const char *format, va_list args)
|
|
|
|
{
|
|
|
|
zend_string *message = zend_vstrpprintf(0, format, args);
|
2021-04-23 17:29:55 +08:00
|
|
|
zend_error_zstr_at(orig_type, error_filename, error_lineno, message);
|
2020-05-29 16:33:22 +08:00
|
|
|
zend_string_release(message);
|
|
|
|
}
|
|
|
|
|
2021-04-23 16:47:08 +08:00
|
|
|
static ZEND_COLD void get_filename_lineno(int type, zend_string **filename, uint32_t *lineno) {
|
2019-03-26 22:46:09 +08:00
|
|
|
/* Obtain relevant filename and lineno */
|
|
|
|
switch (type) {
|
|
|
|
case E_CORE_ERROR:
|
|
|
|
case E_CORE_WARNING:
|
|
|
|
*filename = NULL;
|
|
|
|
*lineno = 0;
|
|
|
|
break;
|
|
|
|
case E_PARSE:
|
|
|
|
case E_COMPILE_ERROR:
|
|
|
|
case E_COMPILE_WARNING:
|
|
|
|
case E_ERROR:
|
|
|
|
case E_NOTICE:
|
|
|
|
case E_DEPRECATED:
|
|
|
|
case E_WARNING:
|
|
|
|
case E_USER_ERROR:
|
|
|
|
case E_USER_WARNING:
|
|
|
|
case E_USER_NOTICE:
|
|
|
|
case E_USER_DEPRECATED:
|
|
|
|
case E_RECOVERABLE_ERROR:
|
|
|
|
if (zend_is_compiling()) {
|
2021-04-23 16:47:08 +08:00
|
|
|
*filename = zend_get_compiled_filename();
|
2019-03-26 22:46:09 +08:00
|
|
|
*lineno = zend_get_compiled_lineno();
|
|
|
|
} else if (zend_is_executing()) {
|
2021-04-23 16:47:08 +08:00
|
|
|
*filename = zend_get_executed_filename_ex();
|
|
|
|
*lineno = zend_get_executed_lineno();
|
2019-03-26 22:46:09 +08:00
|
|
|
} else {
|
|
|
|
*filename = NULL;
|
|
|
|
*lineno = 0;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
*filename = NULL;
|
|
|
|
*lineno = 0;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (!*filename) {
|
2021-04-23 16:47:08 +08:00
|
|
|
*filename = ZSTR_KNOWN(ZEND_STR_UNKNOWN_CAPITALIZED);
|
2019-03-26 22:46:09 +08:00
|
|
|
}
|
|
|
|
}
|
2014-09-09 02:34:26 +08:00
|
|
|
|
2019-03-26 22:46:09 +08:00
|
|
|
ZEND_API ZEND_COLD void zend_error_at(
|
2021-04-23 16:47:08 +08:00
|
|
|
int type, zend_string *filename, uint32_t lineno, const char *format, ...) {
|
2019-03-26 22:46:09 +08:00
|
|
|
va_list args;
|
|
|
|
|
|
|
|
if (!filename) {
|
|
|
|
uint32_t dummy_lineno;
|
|
|
|
get_filename_lineno(type, &filename, &dummy_lineno);
|
|
|
|
}
|
2014-09-09 02:34:26 +08:00
|
|
|
|
2019-03-26 22:46:09 +08:00
|
|
|
va_start(args, format);
|
|
|
|
zend_error_va_list(type, filename, lineno, format, args);
|
|
|
|
va_end(args);
|
|
|
|
}
|
|
|
|
|
2024-01-20 07:46:34 +08:00
|
|
|
#define zend_error_impl(type, format) do { \
|
|
|
|
zend_string *filename; \
|
|
|
|
uint32_t lineno; \
|
|
|
|
va_list args; \
|
|
|
|
get_filename_lineno(type, &filename, &lineno); \
|
|
|
|
va_start(args, format); \
|
|
|
|
zend_error_va_list(type, filename, lineno, format, args); \
|
|
|
|
va_end(args); \
|
|
|
|
} while (0)
|
2019-03-26 22:46:09 +08:00
|
|
|
|
2024-01-20 07:46:34 +08:00
|
|
|
ZEND_API ZEND_COLD void zend_error(int type, const char *format, ...) {
|
|
|
|
zend_error_impl(type, format);
|
2014-09-09 02:34:26 +08:00
|
|
|
}
|
|
|
|
|
2021-04-19 20:25:36 +08:00
|
|
|
ZEND_API ZEND_COLD void zend_error_unchecked(int type, const char *format, ...) {
|
2024-01-20 07:46:34 +08:00
|
|
|
zend_error_impl(type, format);
|
2021-04-19 20:25:36 +08:00
|
|
|
}
|
|
|
|
|
2019-03-27 20:02:28 +08:00
|
|
|
ZEND_API ZEND_COLD ZEND_NORETURN void zend_error_at_noreturn(
|
2021-04-23 16:47:08 +08:00
|
|
|
int type, zend_string *filename, uint32_t lineno, const char *format, ...)
|
2019-03-27 20:02:28 +08:00
|
|
|
{
|
|
|
|
va_list args;
|
|
|
|
|
|
|
|
if (!filename) {
|
|
|
|
uint32_t dummy_lineno;
|
|
|
|
get_filename_lineno(type, &filename, &dummy_lineno);
|
|
|
|
}
|
|
|
|
|
|
|
|
va_start(args, format);
|
|
|
|
zend_error_va_list(type, filename, lineno, format, args);
|
|
|
|
va_end(args);
|
|
|
|
/* Should never reach this. */
|
|
|
|
abort();
|
|
|
|
}
|
|
|
|
|
2024-01-20 07:46:34 +08:00
|
|
|
#define zend_error_noreturn_impl(type, format) do { \
|
|
|
|
zend_string *filename; \
|
|
|
|
uint32_t lineno; \
|
|
|
|
va_list args; \
|
|
|
|
get_filename_lineno(type, &filename, &lineno); \
|
|
|
|
va_start(args, format); \
|
|
|
|
zend_error_va_list(type, filename, lineno, format, args); \
|
|
|
|
va_end(args); \
|
|
|
|
/* Should never reach this. */ \
|
|
|
|
abort(); \
|
|
|
|
} while (0)
|
|
|
|
|
2015-08-19 19:40:56 +08:00
|
|
|
ZEND_API ZEND_COLD ZEND_NORETURN void zend_error_noreturn(int type, const char *format, ...)
|
2014-09-09 02:34:26 +08:00
|
|
|
{
|
2024-01-20 07:46:34 +08:00
|
|
|
zend_error_noreturn_impl(type, format);
|
|
|
|
}
|
2014-09-09 02:34:26 +08:00
|
|
|
|
2024-01-20 07:46:34 +08:00
|
|
|
ZEND_API ZEND_COLD ZEND_NORETURN void zend_error_noreturn_unchecked(int type, const char *format, ...)
|
|
|
|
{
|
|
|
|
zend_error_noreturn_impl(type, format);
|
2014-09-09 02:34:26 +08:00
|
|
|
}
|
2020-05-29 16:33:22 +08:00
|
|
|
|
2023-03-03 18:35:06 +08:00
|
|
|
ZEND_API ZEND_COLD ZEND_NORETURN void zend_strerror_noreturn(int type, int errn, const char *message)
|
|
|
|
{
|
2023-08-06 00:03:46 +08:00
|
|
|
#ifdef HAVE_STRERROR_R
|
|
|
|
char b[1024];
|
|
|
|
|
|
|
|
# ifdef STRERROR_R_CHAR_P
|
|
|
|
char *buf = strerror_r(errn, b, sizeof(b));
|
|
|
|
# else
|
|
|
|
strerror_r(errn, b, sizeof(b));
|
|
|
|
char *buf = b;
|
|
|
|
# endif
|
2023-03-03 18:35:06 +08:00
|
|
|
#else
|
|
|
|
char *buf = strerror(errn);
|
|
|
|
#endif
|
|
|
|
|
|
|
|
zend_error_noreturn(type, "%s: %s (%d)", message, buf, errn);
|
|
|
|
}
|
|
|
|
|
2020-05-29 16:33:22 +08:00
|
|
|
ZEND_API ZEND_COLD void zend_error_zstr(int type, zend_string *message) {
|
2021-04-23 16:47:08 +08:00
|
|
|
zend_string *filename;
|
2020-05-29 16:33:22 +08:00
|
|
|
uint32_t lineno;
|
|
|
|
get_filename_lineno(type, &filename, &lineno);
|
2021-04-23 17:29:55 +08:00
|
|
|
zend_error_zstr_at(type, filename, lineno, message);
|
2020-05-29 16:33:22 +08:00
|
|
|
}
|
2000-06-03 09:49:49 +08:00
|
|
|
|
2022-08-09 22:41:47 +08:00
|
|
|
ZEND_API void zend_begin_record_errors(void)
|
2021-04-29 22:37:53 +08:00
|
|
|
{
|
2021-12-10 22:19:16 +08:00
|
|
|
ZEND_ASSERT(!EG(record_errors) && "Error recording already enabled");
|
2021-04-29 22:37:53 +08:00
|
|
|
EG(record_errors) = true;
|
|
|
|
EG(num_errors) = 0;
|
|
|
|
EG(errors) = NULL;
|
|
|
|
}
|
|
|
|
|
2022-08-09 22:41:47 +08:00
|
|
|
ZEND_API void zend_emit_recorded_errors(void)
|
|
|
|
{
|
|
|
|
EG(record_errors) = false;
|
|
|
|
for (uint32_t i = 0; i < EG(num_errors); i++) {
|
|
|
|
zend_error_info *error = EG(errors)[i];
|
|
|
|
zend_error_zstr_at(error->type, error->filename, error->lineno, error->message);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-04-29 22:37:53 +08:00
|
|
|
ZEND_API void zend_free_recorded_errors(void)
|
|
|
|
{
|
|
|
|
if (!EG(num_errors)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (uint32_t i = 0; i < EG(num_errors); i++) {
|
|
|
|
zend_error_info *info = EG(errors)[i];
|
|
|
|
zend_string_release(info->filename);
|
|
|
|
zend_string_release(info->message);
|
|
|
|
efree(info);
|
|
|
|
}
|
|
|
|
efree(EG(errors));
|
|
|
|
EG(errors) = NULL;
|
|
|
|
EG(num_errors) = 0;
|
|
|
|
}
|
|
|
|
|
2015-08-19 19:40:56 +08:00
|
|
|
ZEND_API ZEND_COLD void zend_throw_error(zend_class_entry *exception_ce, const char *format, ...) /* {{{ */
|
2015-07-04 02:41:17 +08:00
|
|
|
{
|
|
|
|
va_list va;
|
|
|
|
char *message = NULL;
|
2017-12-31 12:35:25 +08:00
|
|
|
|
2020-02-22 18:06:17 +08:00
|
|
|
if (!exception_ce) {
|
2015-07-08 00:37:33 +08:00
|
|
|
exception_ce = zend_ce_error;
|
|
|
|
}
|
2015-07-04 05:04:33 +08:00
|
|
|
|
2019-02-15 20:03:46 +08:00
|
|
|
/* Marker used to disable exception generation during preloading. */
|
|
|
|
if (EG(exception) == (void*)(uintptr_t)-1) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2015-07-04 02:41:17 +08:00
|
|
|
va_start(va, format);
|
|
|
|
zend_vspprintf(&message, 0, format, va);
|
|
|
|
|
2015-07-08 00:37:33 +08:00
|
|
|
//TODO: we can't convert compile-time errors to exceptions yet???
|
2015-07-04 05:04:33 +08:00
|
|
|
if (EG(current_execute_data) && !CG(in_compilation)) {
|
2015-07-04 06:28:11 +08:00
|
|
|
zend_throw_exception(exception_ce, message, 0);
|
2015-07-04 05:04:33 +08:00
|
|
|
} else {
|
2023-09-14 01:19:24 +08:00
|
|
|
zend_error_noreturn(E_ERROR, "%s", message);
|
2015-07-04 02:41:17 +08:00
|
|
|
}
|
2015-07-04 05:04:33 +08:00
|
|
|
|
2015-07-04 02:41:17 +08:00
|
|
|
efree(message);
|
|
|
|
va_end(va);
|
|
|
|
}
|
|
|
|
/* }}} */
|
|
|
|
|
2023-06-06 18:28:19 +08:00
|
|
|
/* type should be one of the BP_VAR_* constants, only special messages happen for isset/empty and unset */
|
|
|
|
ZEND_API ZEND_COLD void zend_illegal_container_offset(const zend_string *container, const zval *offset, int type)
|
|
|
|
{
|
|
|
|
switch (type) {
|
|
|
|
case BP_VAR_IS:
|
|
|
|
zend_type_error("Cannot access offset of type %s in isset or empty",
|
|
|
|
zend_zval_type_name(offset));
|
|
|
|
return;
|
|
|
|
case BP_VAR_UNSET:
|
|
|
|
/* Consistent error for when trying to unset a string offset */
|
|
|
|
if (zend_string_equals(container, ZSTR_KNOWN(ZEND_STR_STRING))) {
|
|
|
|
zend_throw_error(NULL, "Cannot unset string offsets");
|
|
|
|
} else {
|
|
|
|
zend_type_error("Cannot unset offset of type %s on %s", zend_zval_type_name(offset), ZSTR_VAL(container));
|
|
|
|
}
|
|
|
|
return;
|
|
|
|
default:
|
|
|
|
zend_type_error("Cannot access offset of type %s on %s",
|
|
|
|
zend_zval_type_name(offset), ZSTR_VAL(container));
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-08-19 19:40:56 +08:00
|
|
|
ZEND_API ZEND_COLD void zend_type_error(const char *format, ...) /* {{{ */
|
2015-03-19 00:23:09 +08:00
|
|
|
{
|
|
|
|
va_list va;
|
|
|
|
char *message = NULL;
|
|
|
|
|
|
|
|
va_start(va, format);
|
|
|
|
zend_vspprintf(&message, 0, format, va);
|
2015-07-08 05:54:39 +08:00
|
|
|
zend_throw_exception(zend_ce_type_error, message, 0);
|
2015-03-19 00:23:09 +08:00
|
|
|
efree(message);
|
|
|
|
va_end(va);
|
|
|
|
} /* }}} */
|
|
|
|
|
2019-02-05 17:07:07 +08:00
|
|
|
ZEND_API ZEND_COLD void zend_argument_count_error(const char *format, ...) /* {{{ */
|
2015-03-19 00:23:09 +08:00
|
|
|
{
|
|
|
|
va_list va;
|
|
|
|
char *message = NULL;
|
|
|
|
|
|
|
|
va_start(va, format);
|
|
|
|
zend_vspprintf(&message, 0, format, va);
|
2019-02-05 17:07:07 +08:00
|
|
|
zend_throw_exception(zend_ce_argument_count_error, message, 0);
|
2016-08-31 03:09:26 +08:00
|
|
|
efree(message);
|
|
|
|
|
|
|
|
va_end(va);
|
|
|
|
} /* }}} */
|
2015-03-19 00:23:09 +08:00
|
|
|
|
2019-09-05 04:39:02 +08:00
|
|
|
ZEND_API ZEND_COLD void zend_value_error(const char *format, ...) /* {{{ */
|
|
|
|
{
|
|
|
|
va_list va;
|
|
|
|
char *message = NULL;
|
|
|
|
|
|
|
|
va_start(va, format);
|
|
|
|
zend_vspprintf(&message, 0, format, va);
|
|
|
|
zend_throw_exception(zend_ce_value_error, message, 0);
|
|
|
|
efree(message);
|
|
|
|
va_end(va);
|
|
|
|
} /* }}} */
|
|
|
|
|
2021-01-15 19:30:54 +08:00
|
|
|
ZEND_API ZEND_COLD void zend_output_debug_string(bool trigger_break, const char *format, ...) /* {{{ */
|
2000-06-03 09:49:49 +08:00
|
|
|
{
|
|
|
|
#if ZEND_DEBUG
|
|
|
|
va_list args;
|
|
|
|
|
|
|
|
va_start(args, format);
|
2000-06-03 15:34:20 +08:00
|
|
|
# ifdef ZEND_WIN32
|
2000-06-03 09:49:49 +08:00
|
|
|
{
|
|
|
|
char output_buf[1024];
|
|
|
|
|
|
|
|
vsnprintf(output_buf, 1024, format, args);
|
|
|
|
OutputDebugString(output_buf);
|
|
|
|
OutputDebugString("\n");
|
|
|
|
if (trigger_break && IsDebuggerPresent()) {
|
|
|
|
DebugBreak();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
# else
|
|
|
|
vfprintf(stderr, format, args);
|
|
|
|
fprintf(stderr, "\n");
|
|
|
|
# endif
|
|
|
|
va_end(args);
|
|
|
|
#endif
|
|
|
|
}
|
2007-11-03 03:40:39 +08:00
|
|
|
/* }}} */
|
2000-08-10 03:22:35 +08:00
|
|
|
|
2019-05-31 17:09:06 +08:00
|
|
|
ZEND_API ZEND_COLD void zend_user_exception_handler(void) /* {{{ */
|
2015-09-23 23:53:22 +08:00
|
|
|
{
|
2019-05-31 17:09:06 +08:00
|
|
|
zval orig_user_exception_handler;
|
|
|
|
zval params[1], retval2;
|
|
|
|
zend_object *old_exception;
|
2020-03-06 21:57:55 +08:00
|
|
|
|
|
|
|
if (zend_is_unwind_exit(EG(exception))) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2019-05-31 17:09:06 +08:00
|
|
|
old_exception = EG(exception);
|
|
|
|
EG(exception) = NULL;
|
|
|
|
ZVAL_OBJ(¶ms[0], old_exception);
|
2024-03-12 23:32:25 +08:00
|
|
|
|
2019-05-31 17:09:06 +08:00
|
|
|
ZVAL_COPY_VALUE(&orig_user_exception_handler, &EG(user_exception_handler));
|
2024-03-12 23:32:25 +08:00
|
|
|
zend_stack_push(&EG(user_exception_handlers), &orig_user_exception_handler);
|
2023-03-22 03:41:18 +08:00
|
|
|
ZVAL_UNDEF(&EG(user_exception_handler));
|
2019-05-31 17:09:06 +08:00
|
|
|
|
|
|
|
if (call_user_function(CG(function_table), NULL, &orig_user_exception_handler, &retval2, 1, params) == SUCCESS) {
|
|
|
|
zval_ptr_dtor(&retval2);
|
|
|
|
if (EG(exception)) {
|
|
|
|
OBJ_RELEASE(EG(exception));
|
2015-09-23 23:53:22 +08:00
|
|
|
EG(exception) = NULL;
|
|
|
|
}
|
2019-05-31 17:09:06 +08:00
|
|
|
OBJ_RELEASE(old_exception);
|
|
|
|
} else {
|
|
|
|
EG(exception) = old_exception;
|
2015-09-23 23:53:22 +08:00
|
|
|
}
|
2023-03-22 03:41:18 +08:00
|
|
|
|
2024-03-12 23:32:25 +08:00
|
|
|
if (Z_TYPE(EG(user_exception_handler)) == IS_UNDEF) {
|
|
|
|
zval *tmp = zend_stack_top(&EG(user_exception_handlers));
|
|
|
|
if (tmp) {
|
|
|
|
ZVAL_COPY_VALUE(&EG(user_exception_handler), tmp);
|
|
|
|
zend_stack_del_top(&EG(user_exception_handlers));
|
|
|
|
}
|
|
|
|
}
|
2015-09-23 23:53:22 +08:00
|
|
|
} /* }}} */
|
|
|
|
|
2024-01-31 00:34:30 +08:00
|
|
|
ZEND_API zend_result zend_execute_script(int type, zval *retval, zend_file_handle *file_handle)
|
|
|
|
{
|
|
|
|
zend_op_array *op_array = zend_compile_file(file_handle, type);
|
|
|
|
if (file_handle->opened_path) {
|
|
|
|
zend_hash_add_empty_element(&EG(included_files), file_handle->opened_path);
|
|
|
|
}
|
|
|
|
|
|
|
|
zend_result ret = SUCCESS;
|
|
|
|
if (op_array) {
|
|
|
|
zend_execute(op_array, retval);
|
|
|
|
zend_exception_restore();
|
|
|
|
if (UNEXPECTED(EG(exception))) {
|
|
|
|
if (Z_TYPE(EG(user_exception_handler)) != IS_UNDEF) {
|
|
|
|
zend_user_exception_handler();
|
|
|
|
}
|
|
|
|
if (EG(exception)) {
|
|
|
|
ret = zend_exception_error(EG(exception), E_ERROR);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
zend_destroy_static_vars(op_array);
|
|
|
|
destroy_op_array(op_array);
|
|
|
|
efree_size(op_array, sizeof(zend_op_array));
|
|
|
|
} else if (type == ZEND_REQUIRE) {
|
|
|
|
ret = FAILURE;
|
|
|
|
}
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2020-08-28 21:41:27 +08:00
|
|
|
ZEND_API zend_result zend_execute_scripts(int type, zval *retval, int file_count, ...) /* {{{ */
|
2000-08-10 03:22:35 +08:00
|
|
|
{
|
|
|
|
va_list files;
|
|
|
|
int i;
|
|
|
|
zend_file_handle *file_handle;
|
2020-08-28 21:41:27 +08:00
|
|
|
zend_result ret = SUCCESS;
|
2003-01-12 20:39:06 +08:00
|
|
|
|
2000-08-10 03:22:35 +08:00
|
|
|
va_start(files, file_count);
|
2020-08-10 16:28:13 +08:00
|
|
|
for (i = 0; i < file_count; i++) {
|
2000-08-10 03:22:35 +08:00
|
|
|
file_handle = va_arg(files, zend_file_handle *);
|
|
|
|
if (!file_handle) {
|
|
|
|
continue;
|
|
|
|
}
|
2020-08-10 16:28:13 +08:00
|
|
|
if (ret == FAILURE) {
|
|
|
|
continue;
|
|
|
|
}
|
2024-01-31 00:34:30 +08:00
|
|
|
ret = zend_execute_script(type, retval, file_handle);
|
2000-08-10 03:22:35 +08:00
|
|
|
}
|
|
|
|
va_end(files);
|
|
|
|
|
2019-10-10 20:14:36 +08:00
|
|
|
return ret;
|
2000-08-10 03:22:35 +08:00
|
|
|
}
|
2007-11-03 03:40:39 +08:00
|
|
|
/* }}} */
|
2000-08-10 03:22:35 +08:00
|
|
|
|
2000-09-13 03:47:25 +08:00
|
|
|
#define COMPILED_STRING_DESCRIPTION_FORMAT "%s(%d) : %s"
|
|
|
|
|
2014-12-14 06:06:14 +08:00
|
|
|
ZEND_API char *zend_make_compiled_string_description(const char *name) /* {{{ */
|
2000-09-13 03:47:25 +08:00
|
|
|
{
|
2011-09-13 21:29:35 +08:00
|
|
|
const char *cur_filename;
|
2000-09-13 03:47:25 +08:00
|
|
|
int cur_lineno;
|
|
|
|
char *compiled_string_description;
|
|
|
|
|
2014-12-14 06:06:14 +08:00
|
|
|
if (zend_is_compiling()) {
|
2015-06-30 18:59:27 +08:00
|
|
|
cur_filename = ZSTR_VAL(zend_get_compiled_filename());
|
2014-12-14 06:06:14 +08:00
|
|
|
cur_lineno = zend_get_compiled_lineno();
|
|
|
|
} else if (zend_is_executing()) {
|
|
|
|
cur_filename = zend_get_executed_filename();
|
|
|
|
cur_lineno = zend_get_executed_lineno();
|
2000-09-13 03:47:25 +08:00
|
|
|
} else {
|
|
|
|
cur_filename = "Unknown";
|
|
|
|
cur_lineno = 0;
|
|
|
|
}
|
|
|
|
|
2007-02-24 10:17:47 +08:00
|
|
|
zend_spprintf(&compiled_string_description, 0, COMPILED_STRING_DESCRIPTION_FORMAT, cur_filename, cur_lineno, name);
|
2000-09-13 03:47:25 +08:00
|
|
|
return compiled_string_description;
|
|
|
|
}
|
2007-11-03 03:40:39 +08:00
|
|
|
/* }}} */
|
2000-09-13 03:47:25 +08:00
|
|
|
|
2007-11-03 03:40:39 +08:00
|
|
|
void free_estring(char **str_p) /* {{{ */
|
2001-01-15 18:52:06 +08:00
|
|
|
{
|
|
|
|
efree(*str_p);
|
|
|
|
}
|
2014-09-20 13:51:58 +08:00
|
|
|
/* }}} */
|
2014-02-17 21:59:18 +08:00
|
|
|
|
2024-09-07 07:45:26 +08:00
|
|
|
ZEND_API size_t zend_map_ptr_static_size;
|
|
|
|
ZEND_API size_t zend_map_ptr_static_last;
|
|
|
|
|
2018-10-17 20:52:50 +08:00
|
|
|
ZEND_API void zend_map_ptr_reset(void)
|
|
|
|
{
|
|
|
|
CG(map_ptr_last) = global_map_ptr_last;
|
|
|
|
}
|
|
|
|
|
|
|
|
ZEND_API void *zend_map_ptr_new(void)
|
|
|
|
{
|
|
|
|
void **ptr;
|
|
|
|
|
|
|
|
if (CG(map_ptr_last) >= CG(map_ptr_size)) {
|
|
|
|
/* Grow map_ptr table */
|
|
|
|
CG(map_ptr_size) = ZEND_MM_ALIGNED_SIZE_EX(CG(map_ptr_last) + 1, 4096);
|
2024-09-07 07:45:26 +08:00
|
|
|
CG(map_ptr_real_base) = perealloc(CG(map_ptr_real_base), (zend_map_ptr_static_size + CG(map_ptr_size)) * sizeof(void*), 1);
|
2021-08-26 18:27:25 +08:00
|
|
|
CG(map_ptr_base) = ZEND_MAP_PTR_BIASED_BASE(CG(map_ptr_real_base));
|
2018-10-17 20:52:50 +08:00
|
|
|
}
|
2024-09-07 07:45:26 +08:00
|
|
|
ptr = (void**)CG(map_ptr_real_base) + zend_map_ptr_static_size + CG(map_ptr_last);
|
2018-10-17 20:52:50 +08:00
|
|
|
*ptr = NULL;
|
|
|
|
CG(map_ptr_last)++;
|
|
|
|
return ZEND_MAP_PTR_PTR2OFFSET(ptr);
|
|
|
|
}
|
|
|
|
|
2024-09-07 07:45:26 +08:00
|
|
|
ZEND_API void *zend_map_ptr_new_static(void)
|
|
|
|
{
|
|
|
|
void **ptr;
|
|
|
|
|
|
|
|
if (zend_map_ptr_static_last >= zend_map_ptr_static_size) {
|
|
|
|
zend_map_ptr_static_size += 4096;
|
|
|
|
/* Grow map_ptr table */
|
|
|
|
void *new_base = pemalloc((zend_map_ptr_static_size + CG(map_ptr_size)) * sizeof(void*), 1);
|
|
|
|
if (CG(map_ptr_real_base)) {
|
|
|
|
memcpy((void **)new_base + 4096, CG(map_ptr_real_base), (CG(map_ptr_last) + zend_map_ptr_static_size - 4096) * sizeof(void *));
|
|
|
|
pefree(CG(map_ptr_real_base), 1);
|
|
|
|
}
|
|
|
|
CG(map_ptr_real_base) = new_base;
|
|
|
|
CG(map_ptr_base) = ZEND_MAP_PTR_BIASED_BASE(new_base);
|
|
|
|
}
|
|
|
|
ptr = (void**)CG(map_ptr_real_base) + (zend_map_ptr_static_last & 4095);
|
|
|
|
*ptr = NULL;
|
|
|
|
zend_map_ptr_static_last++;
|
|
|
|
return ZEND_MAP_PTR_PTR2OFFSET(ptr);
|
|
|
|
}
|
|
|
|
|
2018-10-17 20:52:50 +08:00
|
|
|
ZEND_API void zend_map_ptr_extend(size_t last)
|
|
|
|
{
|
|
|
|
if (last > CG(map_ptr_last)) {
|
|
|
|
void **ptr;
|
|
|
|
|
|
|
|
if (last >= CG(map_ptr_size)) {
|
|
|
|
/* Grow map_ptr table */
|
|
|
|
CG(map_ptr_size) = ZEND_MM_ALIGNED_SIZE_EX(last, 4096);
|
2024-09-07 07:45:26 +08:00
|
|
|
CG(map_ptr_real_base) = perealloc(CG(map_ptr_real_base), (zend_map_ptr_static_size + CG(map_ptr_size)) * sizeof(void*), 1);
|
2021-08-26 18:27:25 +08:00
|
|
|
CG(map_ptr_base) = ZEND_MAP_PTR_BIASED_BASE(CG(map_ptr_real_base));
|
2018-10-17 20:52:50 +08:00
|
|
|
}
|
2024-09-07 07:45:26 +08:00
|
|
|
ptr = (void**)CG(map_ptr_real_base) + zend_map_ptr_static_size + CG(map_ptr_last);
|
2018-10-17 20:52:50 +08:00
|
|
|
memset(ptr, 0, (last - CG(map_ptr_last)) * sizeof(void*));
|
|
|
|
CG(map_ptr_last) = last;
|
|
|
|
}
|
|
|
|
}
|
2021-08-11 16:28:52 +08:00
|
|
|
|
|
|
|
ZEND_API void zend_alloc_ce_cache(zend_string *type_name)
|
|
|
|
{
|
|
|
|
if (ZSTR_HAS_CE_CACHE(type_name) || !ZSTR_IS_INTERNED(type_name)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ((GC_FLAGS(type_name) & IS_STR_PERMANENT) && startup_done) {
|
|
|
|
/* Don't allocate slot on permanent interned string outside module startup.
|
|
|
|
* The cache slot would no longer be valid on the next request. */
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (zend_string_equals_literal_ci(type_name, "self")
|
|
|
|
|| zend_string_equals_literal_ci(type_name, "parent")) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* We use the refcount to keep map_ptr of corresponding type */
|
|
|
|
uint32_t ret;
|
|
|
|
do {
|
2021-08-23 19:04:02 +08:00
|
|
|
ret = ZEND_MAP_PTR_NEW_OFFSET();
|
2021-08-11 16:28:52 +08:00
|
|
|
} while (ret <= 2);
|
|
|
|
GC_ADD_FLAGS(type_name, IS_STR_CLASS_NAME_MAP_PTR);
|
|
|
|
GC_SET_REFCOUNT(type_name, ret);
|
|
|
|
}
|