Commit 735a38f1839 for php.net

commit 735a38f1839b02548a44e92426c3feaf2a02d1a4
Author: Gina Peter Banyard <girgias@php.net>
Date:   Sun Sep 6 19:11:22 2026 +0100

    Zend: assert that refcounted zval in zval_internal_ptr_dtor is a string (#23592)

diff --git a/Zend/zend_variables.c b/Zend/zend_variables.c
index 02c286ac486..1ee84ce5c7a 100644
--- a/Zend/zend_variables.c
+++ b/Zend/zend_variables.c
@@ -101,19 +101,16 @@ ZEND_API void zval_ptr_safe_dtor(zval *zval_ptr)
 ZEND_API void zval_internal_ptr_dtor(zval *zval_ptr) /* {{{ */
 {
 	if (Z_REFCOUNTED_P(zval_ptr)) {
+		ZEND_ASSERT(Z_TYPE_P(zval_ptr) == IS_STRING && "Internal zval's can't be arrays, objects, resources or reference");
 		zend_refcounted *ref = Z_COUNTED_P(zval_ptr);

 		if (GC_DELREF(ref) == 0) {
-			if (Z_TYPE_P(zval_ptr) == IS_STRING) {
-				zend_string *str = (zend_string*)ref;
-
-				CHECK_ZVAL_STRING(str);
-				ZEND_ASSERT(!ZSTR_IS_INTERNED(str));
-				ZEND_ASSERT((GC_FLAGS(str) & IS_STR_PERSISTENT));
-				free(str);
-			} else {
-				zend_error_noreturn(E_CORE_ERROR, "Internal zval's can't be arrays, objects, resources or reference");
-			}
+			zend_string *str = (zend_string*)ref;
+
+			CHECK_ZVAL_STRING(str);
+			ZEND_ASSERT(!ZSTR_IS_INTERNED(str));
+			ZEND_ASSERT((GC_FLAGS(str) & IS_STR_PERSISTENT));
+			free(str);
 		}
 	}
 }