zend_set_local_var() overwrites existing compiled variable (CV) zval without calling zval_ptr_dtor()
I maintainer di solito rispondono entro 1 giorno
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 82/100
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
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
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di php/php-src
-
`openssl_pkcs7_read()` / `openssl_cms_read()`: CRLs overwrite certificates in the output arrayApertaBug Status: Needs Triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
I maintainer di solito rispondono entro 1 giorno
-
ext/mbstring: mb_regex_substitute() reads past the replacement string's end on a truncated trailing multibyte lead byteForse già presa Una pull request collegata a questa issue è aperta o già unita. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 74/100
php/php-src#24769 · 3 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
master: part of the mbstring bailout fix got lost in a mergeForse già presa @lazerg l’ha presa 6 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 1 giorno
-
Bug Status: Needs Triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 64/100
I maintainer di solito rispondono entro 1 giorno
-
quoted_printable_encode() produces lines longer than 76 characters for bytes 0xF5 to 0xFFForse già presa Una pull request collegata a questa issue è aperta o già unita. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
I maintainer di solito rispondono entro 1 giorno
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
I maintainer di solito rispondono entro 2 giorni
-
Abort (SIGABRT) when stderr is a closed pipe: uncaught fmt::system_error in ccache_main's catchForse già presa Una pull request collegata a questa issue è aperta o già unita. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
I maintainer di solito rispondono entro 3 giorni
-
common/amount: parse_amount_sat misparses sub-satoshi msat with leading zero and accepts invalid suffixesForse già presa @bhuvan-somisetty l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
ElementsProject/lightning#9674 ·
I maintainer di solito rispondono entro 1 giorno
-
mcp: a projectPath naming a file inside a project returns isError ("Path is not a directory")Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
colbymchenry/codegraph#2982 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
I maintainer di solito rispondono entro 1 giorno