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;
 }