php / php/php-src

Hashtable initialized at extension module level gets corrupted in processing first request itself

Offen
#11,783 6 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Bug Status: Needs Triage
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

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Ö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

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.