Commit a15ba7672c5 for php.net
commit a15ba7672c52de712f81da21f639abafe42907db
Author: Tim Düsterhus <tim@tideways-gmbh.com>
Date: Wed Feb 4 11:11:11 2026 +0100
zend_ini: Make `ZEND_INI_GET_ADDR()` return a `void*` pointer (#21119)
* zend_ini: Make `ZEND_INI_GET_ADDR()` return a `void*` pointer
Since the actual type of the storage location is not known, a `void*` is more
appropriate and avoids explicit casts that are no more safe than the implicit
cast from `void*`.
* tree-wide: Remove explicit casts of `ZEND_INI_GET_ADDR()`
* UPGRADING.INTERNALS
diff --git a/UPGRADING.INTERNALS b/UPGRADING.INTERNALS
index 9e2b3ae4794..840edc786ac 100644
--- a/UPGRADING.INTERNALS
+++ b/UPGRADING.INTERNALS
@@ -64,6 +64,10 @@ PHP 8.6 INTERNALS UPGRADE NOTES
zend_enum_RoundingMode parameter.
. Added Z_PARAM_ENUM().
. Added zend_enum_fetch_case_id().
+ . ZEND_INI_GET_ADDR() is now a void* pointer instead of a char* pointer. This
+ more correctly represents the generic nature of the returned pointer and
+ allows to remove explicit casts, but possibly breaks pointer arithmetic
+ performed on the result.
========================
2. Build system changes
diff --git a/Zend/zend.c b/Zend/zend.c
index d2be69a7576..49e18f1a777 100644
--- a/Zend/zend.c
+++ b/Zend/zend.c
@@ -157,7 +157,7 @@ static ZEND_INI_MH(OnUpdateScriptEncoding) /* {{{ */
static ZEND_INI_MH(OnUpdateAssertions) /* {{{ */
{
- zend_long *p = (zend_long *) ZEND_INI_GET_ADDR();
+ zend_long *p = ZEND_INI_GET_ADDR();
zend_long val = zend_ini_parse_quantity_warn(new_value, entry->name);
diff --git a/Zend/zend_ini.c b/Zend/zend_ini.c
index 8d26cd65579..5e3a12e4553 100644
--- a/Zend/zend_ini.c
+++ b/Zend/zend_ini.c
@@ -963,7 +963,7 @@ ZEND_INI_DISP(display_link_numbers) /* {{{ */
/* Standard message handlers */
ZEND_API ZEND_INI_MH(OnUpdateBool) /* {{{ */
{
- bool *p = (bool *) ZEND_INI_GET_ADDR();
+ bool *p = ZEND_INI_GET_ADDR();
*p = zend_ini_parse_bool(new_value);
return SUCCESS;
}
@@ -971,7 +971,7 @@ ZEND_API ZEND_INI_MH(OnUpdateBool) /* {{{ */
ZEND_API ZEND_INI_MH(OnUpdateLong) /* {{{ */
{
- zend_long *p = (zend_long *) ZEND_INI_GET_ADDR();
+ zend_long *p = ZEND_INI_GET_ADDR();
*p = zend_ini_parse_quantity_warn(new_value, entry->name);
return SUCCESS;
}
@@ -984,7 +984,7 @@ ZEND_API ZEND_INI_MH(OnUpdateLongGEZero) /* {{{ */
return FAILURE;
}
- zend_long *p = (zend_long *) ZEND_INI_GET_ADDR();
+ zend_long *p = ZEND_INI_GET_ADDR();
*p = tmp;
return SUCCESS;
@@ -993,7 +993,7 @@ ZEND_API ZEND_INI_MH(OnUpdateLongGEZero) /* {{{ */
ZEND_API ZEND_INI_MH(OnUpdateReal) /* {{{ */
{
- double *p = (double *) ZEND_INI_GET_ADDR();
+ double *p = ZEND_INI_GET_ADDR();
*p = zend_strtod(ZSTR_VAL(new_value), NULL);
return SUCCESS;
}
@@ -1001,7 +1001,7 @@ ZEND_API ZEND_INI_MH(OnUpdateReal) /* {{{ */
ZEND_API ZEND_INI_MH(OnUpdateString) /* {{{ */
{
- char **p = (char **) ZEND_INI_GET_ADDR();
+ char **p = ZEND_INI_GET_ADDR();
*p = new_value ? ZSTR_VAL(new_value) : NULL;
return SUCCESS;
}
@@ -1013,7 +1013,7 @@ ZEND_API ZEND_INI_MH(OnUpdateStringUnempty) /* {{{ */
return FAILURE;
}
- char **p = (char **) ZEND_INI_GET_ADDR();
+ char **p = ZEND_INI_GET_ADDR();
*p = new_value ? ZSTR_VAL(new_value) : NULL;
return SUCCESS;
}
@@ -1021,7 +1021,7 @@ ZEND_API ZEND_INI_MH(OnUpdateStringUnempty) /* {{{ */
ZEND_API ZEND_INI_MH(OnUpdateStr) /* {{{ */
{
- zend_string **p = (zend_string **) ZEND_INI_GET_ADDR();
+ zend_string **p = ZEND_INI_GET_ADDR();
*p = new_value;
return SUCCESS;
}
@@ -1033,7 +1033,7 @@ ZEND_API ZEND_INI_MH(OnUpdateStrNotEmpty) /* {{{ */
return FAILURE;
}
- zend_string **p = (zend_string **) ZEND_INI_GET_ADDR();
+ zend_string **p = ZEND_INI_GET_ADDR();
*p = new_value;
return SUCCESS;
}
diff --git a/Zend/zend_ini.h b/Zend/zend_ini.h
index 5a7377f1181..4bb90d6ef0a 100644
--- a/Zend/zend_ini.h
+++ b/Zend/zend_ini.h
@@ -257,6 +257,6 @@ typedef struct _zend_ini_parser_param {
# define ZEND_INI_GET_BASE() ((char *) ts_resource(*((int *) mh_arg2)))
#endif
-#define ZEND_INI_GET_ADDR() (ZEND_INI_GET_BASE() + (size_t) mh_arg1)
+#define ZEND_INI_GET_ADDR() ((void*)(ZEND_INI_GET_BASE() + (size_t) mh_arg1))
#endif /* ZEND_INI_H */
diff --git a/ext/bcmath/bcmath.c b/ext/bcmath/bcmath.c
index 539fa9d9cf5..63d9cd2a994 100644
--- a/ext/bcmath/bcmath.c
+++ b/ext/bcmath/bcmath.c
@@ -74,7 +74,7 @@ ZEND_GET_MODULE(bcmath)
ZEND_INI_MH(OnUpdateScale)
{
- int *p;
+ int *p = ZEND_INI_GET_ADDR();
zend_long tmp;
tmp = zend_ini_parse_quantity_warn(new_value, entry->name);
@@ -82,7 +82,6 @@ ZEND_INI_MH(OnUpdateScale)
return FAILURE;
}
- p = (int *) ZEND_INI_GET_ADDR();
*p = (int) tmp;
return SUCCESS;
diff --git a/ext/intl/php_intl.c b/ext/intl/php_intl.c
index 00001e9985b..441b26ae088 100644
--- a/ext/intl/php_intl.c
+++ b/ext/intl/php_intl.c
@@ -115,7 +115,7 @@ char* canonicalize_locale_string(const char* locale) {
static PHP_INI_MH(OnUpdateErrorLevel)
{
- zend_long *p = (zend_long *) ZEND_INI_GET_ADDR();
+ zend_long *p = ZEND_INI_GET_ADDR();
*p = zend_ini_parse_quantity_warn(new_value, entry->name);
if (*p) {
php_error_docref("session.configuration", E_DEPRECATED,
diff --git a/ext/opcache/zend_accelerator_module.c b/ext/opcache/zend_accelerator_module.c
index a2569e07f14..befbb621f4c 100644
--- a/ext/opcache/zend_accelerator_module.c
+++ b/ext/opcache/zend_accelerator_module.c
@@ -87,7 +87,7 @@ static ZEND_INI_MH(OnUpdateMemoryConsumption)
return FAILURE;
}
- zend_long *p = (zend_long *) ZEND_INI_GET_ADDR();
+ zend_long *p = ZEND_INI_GET_ADDR();
zend_long memsize = atoi(ZSTR_VAL(new_value));
/* sanity check we must use at least 8 MB */
if (memsize < 8) {
@@ -104,7 +104,7 @@ static ZEND_INI_MH(OnUpdateMemoryConsumption)
static ZEND_INI_MH(OnUpdateInternedStringsBuffer)
{
- zend_long *p = (zend_long *) ZEND_INI_GET_ADDR();
+ zend_long *p = ZEND_INI_GET_ADDR();
zend_long size = zend_ini_parse_quantity_warn(new_value, entry->name);
if (size < 0) {
@@ -123,7 +123,7 @@ static ZEND_INI_MH(OnUpdateInternedStringsBuffer)
static ZEND_INI_MH(OnUpdateMaxAcceleratedFiles)
{
- zend_long *p = (zend_long *) ZEND_INI_GET_ADDR();
+ zend_long *p = ZEND_INI_GET_ADDR();
zend_long size = atoi(ZSTR_VAL(new_value));
/* sanity check we must use a value between MIN_ACCEL_FILES and MAX_ACCEL_FILES */
if (size < MIN_ACCEL_FILES) {
@@ -140,7 +140,7 @@ static ZEND_INI_MH(OnUpdateMaxAcceleratedFiles)
static ZEND_INI_MH(OnUpdateMaxWastedPercentage)
{
- double *p = (double *) ZEND_INI_GET_ADDR();
+ double *p = ZEND_INI_GET_ADDR();
zend_long percentage = atoi(ZSTR_VAL(new_value));
if (percentage <= 0 || percentage > 50) {
@@ -159,7 +159,7 @@ static ZEND_INI_MH(OnEnable)
return OnUpdateBool(entry, new_value, mh_arg1, mh_arg2, mh_arg3, stage);
} else {
/* It may be only temporarily disabled */
- bool *p = (bool *) ZEND_INI_GET_ADDR();
+ bool *p = ZEND_INI_GET_ADDR();
if (zend_ini_parse_bool(new_value)) {
if (*p) {
/* Do not warn if OPcache is enabled, as the update would be a noop anyways. */
@@ -206,7 +206,7 @@ static ZEND_INI_MH(OnUpdateJit)
static ZEND_INI_MH(OnUpdateJitDebug)
{
- zend_long *p = (zend_long *) ZEND_INI_GET_ADDR();
+ zend_long *p = ZEND_INI_GET_ADDR();
zend_long val = zend_ini_parse_quantity_warn(new_value, entry->name);
if (zend_jit_debug_config(*p, val, stage) == SUCCESS) {
@@ -220,7 +220,7 @@ static ZEND_INI_MH(OnUpdateCounter)
{
zend_long val = zend_ini_parse_quantity_warn(new_value, entry->name);
if (val >= 0 && val < 256) {
- zend_long *p = (zend_long *) ZEND_INI_GET_ADDR();
+ zend_long *p = ZEND_INI_GET_ADDR();
*p = val;
return SUCCESS;
}
@@ -232,7 +232,7 @@ static ZEND_INI_MH(OnUpdateUnrollC)
{
zend_long val = zend_ini_parse_quantity_warn(new_value, entry->name);
if (val > 0 && val < ZEND_JIT_TRACE_MAX_CALL_DEPTH) {
- zend_long *p = (zend_long *) ZEND_INI_GET_ADDR();
+ zend_long *p = ZEND_INI_GET_ADDR();
*p = val;
return SUCCESS;
}
@@ -245,7 +245,7 @@ static ZEND_INI_MH(OnUpdateUnrollR)
{
zend_long val = zend_ini_parse_quantity_warn(new_value, entry->name);
if (val >= 0 && val < ZEND_JIT_TRACE_MAX_RET_DEPTH) {
- zend_long *p = (zend_long *) ZEND_INI_GET_ADDR();
+ zend_long *p = ZEND_INI_GET_ADDR();
*p = val;
return SUCCESS;
}
@@ -258,7 +258,7 @@ static ZEND_INI_MH(OnUpdateUnrollL)
{
zend_long val = zend_ini_parse_quantity_warn(new_value, entry->name);
if (val > 0 && val < ZEND_JIT_TRACE_MAX_LOOPS_UNROLL) {
- zend_long *p = (zend_long *) ZEND_INI_GET_ADDR();
+ zend_long *p = ZEND_INI_GET_ADDR();
*p = val;
return SUCCESS;
}
@@ -271,7 +271,7 @@ static ZEND_INI_MH(OnUpdateMaxTraceLength)
{
zend_long val = zend_ini_parse_quantity_warn(new_value, entry->name);
if (val > 3 && val <= ZEND_JIT_TRACE_MAX_LENGTH) {
- zend_long *p = (zend_long *) ZEND_INI_GET_ADDR();
+ zend_long *p = ZEND_INI_GET_ADDR();
*p = val;
return SUCCESS;
}
diff --git a/ext/session/session.c b/ext/session/session.c
index c2778b85ff8..1f0c3c7213e 100644
--- a/ext/session/session.c
+++ b/ext/session/session.c
@@ -812,7 +812,7 @@ static PHP_INI_MH(OnUpdateSessionGcProbability)
return FAILURE;
}
- zend_long *p = (zend_long *) ZEND_INI_GET_ADDR();
+ zend_long *p = ZEND_INI_GET_ADDR();
*p = tmp;
return SUCCESS;
@@ -830,7 +830,7 @@ static PHP_INI_MH(OnUpdateSessionDivisor)
return FAILURE;
}
- zend_long *p = (zend_long *) ZEND_INI_GET_ADDR();
+ zend_long *p = ZEND_INI_GET_ADDR();
*p = tmp;
return SUCCESS;
@@ -859,7 +859,7 @@ static PHP_INI_MH(OnUpdateUseOnlyCookies)
{
SESSION_CHECK_ACTIVE_STATE;
SESSION_CHECK_OUTPUT_STATE;
- bool *p = (bool *) ZEND_INI_GET_ADDR();
+ bool *p = ZEND_INI_GET_ADDR();
*p = zend_ini_parse_bool(new_value);
if (!*p) {
php_error_docref("session.configuration", E_DEPRECATED, "Disabling session.use_only_cookies INI setting is deprecated");
@@ -871,7 +871,7 @@ static PHP_INI_MH(OnUpdateUseTransSid)
{
SESSION_CHECK_ACTIVE_STATE;
SESSION_CHECK_OUTPUT_STATE;
- bool *p = (bool *) ZEND_INI_GET_ADDR();
+ bool *p = ZEND_INI_GET_ADDR();
*p = zend_ini_parse_bool(new_value);
if (*p) {
php_error_docref("session.configuration", E_DEPRECATED, "Enabling session.use_trans_sid INI setting is deprecated");
diff --git a/ext/soap/soap.c b/ext/soap/soap.c
index 471b2d622d9..6c850a27cf0 100644
--- a/ext/soap/soap.c
+++ b/ext/soap/soap.c
@@ -349,7 +349,7 @@ ZEND_GET_MODULE(soap)
ZEND_INI_MH(OnUpdateCacheMode)
{
- char *p = (char *) ZEND_INI_GET_ADDR();
+ char *p = ZEND_INI_GET_ADDR();
*p = (char)atoi(ZSTR_VAL(new_value));
return SUCCESS;
}
diff --git a/ext/standard/assert.c b/ext/standard/assert.c
index 258447576e1..a29d022b4ac 100644
--- a/ext/standard/assert.c
+++ b/ext/standard/assert.c
@@ -79,7 +79,7 @@ static PHP_INI_MH(OnChangeCallback) /* {{{ */
static PHP_INI_MH(OnUpdateActiveBool)
{
- bool *p = (bool *) ZEND_INI_GET_ADDR();
+ bool *p = ZEND_INI_GET_ADDR();
*p = zend_ini_parse_bool(new_value);
if (php_must_emit_ini_deprecation(stage) && !*p) {
php_error_docref(NULL, E_DEPRECATED, "assert.active INI setting is deprecated");
@@ -89,7 +89,7 @@ static PHP_INI_MH(OnUpdateActiveBool)
static PHP_INI_MH(OnUpdateBailBool)
{
- bool *p = (bool *) ZEND_INI_GET_ADDR();
+ bool *p = ZEND_INI_GET_ADDR();
*p = zend_ini_parse_bool(new_value);
if (php_must_emit_ini_deprecation(stage) && *p) {
php_error_docref(NULL, E_DEPRECATED, "assert.bail INI setting is deprecated");
@@ -99,7 +99,7 @@ static PHP_INI_MH(OnUpdateBailBool)
static PHP_INI_MH(OnUpdateExceptionBool)
{
- bool *p = (bool *) ZEND_INI_GET_ADDR();
+ bool *p = ZEND_INI_GET_ADDR();
*p = zend_ini_parse_bool(new_value);
if (php_must_emit_ini_deprecation(stage) && !*p) {
php_error_docref(NULL, E_DEPRECATED, "assert.exception INI setting is deprecated");
@@ -110,7 +110,7 @@ static PHP_INI_MH(OnUpdateExceptionBool)
static PHP_INI_MH(OnUpdateWarningBool)
{
- bool *p = (bool *) ZEND_INI_GET_ADDR();
+ bool *p = ZEND_INI_GET_ADDR();
*p = zend_ini_parse_bool(new_value);
if (php_must_emit_ini_deprecation(stage) && !*p) {
php_error_docref(NULL, E_DEPRECATED, "assert.warning INI setting is deprecated");
diff --git a/ext/zend_test/observer.c b/ext/zend_test/observer.c
index 348996b7ac1..85c7d82da0e 100644
--- a/ext/zend_test/observer.c
+++ b/ext/zend_test/observer.c
@@ -326,7 +326,7 @@ static void zend_test_execute_internal(zend_execute_data *execute_data, zval *re
static ZEND_INI_MH(zend_test_observer_OnUpdateCommaList)
{
- zend_array **p = (zend_array **) ZEND_INI_GET_ADDR();
+ zend_array **p = ZEND_INI_GET_ADDR();
zend_string *funcname;
zend_function *func;
if (!ZT_G(observer_enabled)) {
diff --git a/ext/zlib/zlib.c b/ext/zlib/zlib.c
index 68c5572931b..4a6bb81899c 100644
--- a/ext/zlib/zlib.c
+++ b/ext/zlib/zlib.c
@@ -1293,7 +1293,7 @@ static PHP_INI_MH(OnUpdate_zlib_output_compression)
}
}
- zend_long *p = (zend_long *) ZEND_INI_GET_ADDR();
+ zend_long *p = ZEND_INI_GET_ADDR();
*p = int_value;
ZLIBG(output_compression) = ZLIBG(output_compression_default);
diff --git a/main/fopen_wrappers.c b/main/fopen_wrappers.c
index f1ab7312c46..b6f32ce309d 100644
--- a/main/fopen_wrappers.c
+++ b/main/fopen_wrappers.c
@@ -72,7 +72,7 @@ Allows any change to open_basedir setting in during Startup and Shutdown events,
or a tightening during activation/runtime/deactivation */
PHPAPI ZEND_INI_MH(OnUpdateBaseDir)
{
- char **p = (char **) ZEND_INI_GET_ADDR();
+ char **p = ZEND_INI_GET_ADDR();
char *pathbuf, *ptr, *end;
if (stage == PHP_INI_STAGE_STARTUP || stage == PHP_INI_STAGE_SHUTDOWN || stage == PHP_INI_STAGE_ACTIVATE || stage == PHP_INI_STAGE_DEACTIVATE) {
diff --git a/main/main.c b/main/main.c
index afb9291586d..8062f92fe1b 100644
--- a/main/main.c
+++ b/main/main.c
@@ -670,7 +670,7 @@ static PHP_INI_MH(OnUpdateInputEncoding)
static PHP_INI_MH(OnUpdateReportMemleaks)
{
- bool *p = (bool *) ZEND_INI_GET_ADDR();
+ bool *p = ZEND_INI_GET_ADDR();
bool new_bool_value = zend_ini_parse_bool(new_value);
if (!new_bool_value) {
@@ -707,7 +707,7 @@ static PHP_INI_MH(OnUpdateErrorLog)
return FAILURE;
}
}
- char **p = (char **) ZEND_INI_GET_ADDR();
+ char **p = ZEND_INI_GET_ADDR();
*p = new_value && ZSTR_LEN(new_value) > 0 ? ZSTR_VAL(new_value) : NULL;
return SUCCESS;
}
@@ -722,7 +722,7 @@ static PHP_INI_MH(OnUpdateMailLog)
return FAILURE;
}
}
- char **p = (char **) ZEND_INI_GET_ADDR();
+ char **p = ZEND_INI_GET_ADDR();
*p = new_value && ZSTR_LEN(new_value) > 0 ? ZSTR_VAL(new_value) : NULL;
return SUCCESS;
}