Hashtable initialized at extension module level gets corrupted in processing first request itself
Nadie ha tomado este issue todavía.
- 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
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- 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