Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

zend_set_local_var() overwrites existing compiled variable (CV) zval without calling zval_ptr_dtor()

Aperta Adatta ai principianti
#24,668 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

@lazerg ci sta già lavorando.

Dal 25/10/2026.

  • #24670 di @lazerg — aperta

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
82/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
c, php
Ambito
backend

Direzione di ricerca

Leggi Zend/zend_execute_API.c e confronta il ramo delle variabili compilate di zend_set_local_var() con zend_set_local_var_str() e il ramo della tabella dei simboli. Verifica come vengono rilasciati i valori zval esistenti prima della sostituzione, quindi esegui i test pertinenti per l’assegnazione delle variabili locali e il conteggio dei riferimenti. Il lavoro è completato quando la sostituzione di una variabile compilata già valorizzata rilascia il valore precedente senza compromettere il comportamento esistente.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

Bug Status: Needs Triage
Description

In Zend/zend_execute_API.c (lines 1927–1959), when zend_set_local_var(zend_string *name, zval *value, bool force) finds a matching compiled variable (EX_VAR_NUM(str - op_array->vars)), it overwrites *var directly via ZVAL_COPY_VALUE(var, value) without calling zval_ptr_dtor(var) first:

				do {
					if (ZSTR_H(*str) == h &&
					    zend_string_equal_content(*str, name)) {
						zval *var = EX_VAR_NUM(str - op_array->vars);
						ZVAL_COPY_VALUE(var, value);
						return SUCCESS;
					}
					str++;
				} while (str != end);

Compare this with zend_set_local_var_str() immediately below it in Zend/zend_execute_API.c (lines 1978–1987):

				do {
					if (ZSTR_H(*str) == h &&
					    zend_string_equals_cstr(*str, name, len)) {
						zval *var = EX_VAR_NUM(str - op_array->vars);
						zval_ptr_dtor(var);
						ZVAL_COPY_VALUE(var, value);
						return SUCCESS;
					}
					str++;
				} while (str != end);

And in the EX_CALL_INFO() & ZEND_CALL_HAS_SYMBOL_TABLE branch of zend_set_local_var() (line 1954), zend_hash_update_ind(execute_data->symbol_table, name, value) is called, which properly invokes the destructor on the old value. Only the CV branch of zend_set_local_var() (line 1940) omits zval_ptr_dtor(var);, leaking the previous reference-counted value if the CV was already populated.

Suggested Patch
--- a/Zend/zend_execute_API.c
+++ b/Zend/zend_execute_API.c
@@ -1937,6 +1937,7 @@ ZEND_API zend_result zend_set_local_var(zend_string *name, zval *value, bool for
 					if (ZSTR_H(*str) == h &&
 					    zend_string_equal_content(*str, name)) {
 						zval *var = EX_VAR_NUM(str - op_array->vars);
+						zval_ptr_dtor(var);
 						ZVAL_COPY_VALUE(var, value);
 						return SUCCESS;
 					}
PHP Version
PHP 8.4, PHP 8.5, master
Operating System

All

Lingua principale
C
Stelle
40.7k
Fork
8.3k
Merge medio
2g 17h
PR unite (30g)
159

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di php/php-src

Tutte le issue di php/php-src

Issue simili

Altre issue su C

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.