php / php/php-src

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

Abierto
#11,783 6 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Bug Status: Needs Triage
Lenguaje dominante
C
Estrellas
40.4k
Forks
8.1k
Merge medio
2 d 13 h
PR fusionados (30 d)
96

Descripción

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

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Comienza con el constructor global del módulo mostrado, la llamada a zend_hash_init y el bucle ZEND_HASH_FOREACH_KEY_VAL del lado de la request; reproduce el comportamiento de la primera request en PHP 8.1.12. Traza los ciclos de vida de la tabla hash y de zval desde el análisis de INI hasta el procesamiento de la request, y considera resuelto el issue cuando las cadenas almacenadas sigan siendo válidas y se impriman correctamente durante la primera request.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
c, php
Área
backend
Tipo de issue
Error
Dificultad
4/5
Tiempo estimado
3-5 días
Estado de actividad
Estancado
Claridad
Necesita aclaración
Aptitud para principiantes
30/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.