Hashtable initialized at extension module level gets corrupted in processing first request itself
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- C
- Sterne
- 40.4k
- Forks
- 8.2k
- Ø Merge
- 2 T. 13 Std.
- Gemergte PRs (30 T.)
- 96
Beschreibung
Description
Here my struct member zend_long is persistent at each request but not hashtable keys and values, However a strange thing is number of elements are consistent but values are corrupted.
The following code:
ZEND_BEGIN_MODULE_GLOBALS(myextension)
{
struct {
zend_long matcher;
HashTable *list;
}mystruct;
}
my_ctor()
{
ALLOC_HASHTABLE(myextension_G(mystruct.list));
zend_hash_init(myextension_G(mystruct.list), 0, NULL, ZVAL_PTR_DTOR, 0); // tried with changing last param as 1 too to keep it persistent but no change
parse_mystruct_value_from_ini();
}
//This is the method to populate values in my hash table from customized ini settings.
static void parse_mystruct_value_from_ini()
{
char *list = emalloc(strlen(INI_STR("structlist")) + 1);
strcpy(list, INI_STR("structlist"));
if (strlen(list) > 0) {
char *token = strtok(mystrcut_list_ini, ",");
while (token != NULL) {
zval * token_zval = NULL;
ZVAL_NULL(token_zval);
ZVAL_STRING(token_zval, token,1);
zend_compat_hash_next_index_insert(myextesion_G(mystruct.list), token_zval);
}
ZEND_INIT_MODULE_GLOBALS(my extension , my_ctor(), NULL)
Resulted in this output:
when I try to print the values in request code, th values are corrupted.
Trying to print the value something like this
ZEND_HASH_FOREACH_KEY_VAL(myextension_G(mystruct.list), idx,key, zval)
{
print("*** Lets print global struct list = %s ****** \n" , Z_STRVAL_P(zval));
}
ZEND_HASH_FOREACH_END();
*** Lets print global struct list inside request process = ******
*** Lets print global struct list inside request process = xterm ******
*** Lets print global struct list inside request process = TERM ******
PHP Version
PHP 8.1.12
Operating System
Ubuntu 20.0.4
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Beginne mit dem gezeigten modulglobalen Konstruktor, dem Aufruf von zend_hash_init und der requestseitigen ZEND_HASH_FOREACH_KEY_VAL-Schleife; reproduziere das Verhalten beim ersten Request unter PHP 8.1.12. Verfolge die Lebensdauer der Hash-Tabelle und von zval vom Parsen der INI bis zur Request-Verarbeitung und betrachte das Issue als erledigt, wenn die gespeicherten Strings gültig bleiben und während des ersten Requests korrekt ausgegeben werden.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- c, php
- Bereich
- backend
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Muss geklärt werden
- Anfängerfreundlichkeit
- 30/100