Re: Fwd: How to create Persistent zval?
>> Hello,
>>
>> I am trying to store a zval object into the persistent list in zend VM.
>> (Using EG(persistent_list) and zend_rscd_list_entry)
>>
>> Which works fine if I store/fetch the zval in the same request context.
>>
>> But it seems that zend engine cleans up the zval object after the
request,
>> when the next request comes, the fetched list entry points to a freed
zval
>> address and it makes php segmentationfault. I guess zval is allocated by
>> emalloc, so I cant keep it cross requests?
> For persistent alloc, you should use pemalloc() , which is just a
> wrapper leading to libc's malloc.
> If you use emalloc() , the Zend Memory Manager will free the storage
> at the end of the request, thus leading to use-after-free crash if you
> reuse your pointer on a next request.
--- Disclaimer ---
I'm passing this along; Joe is having technical difficulties and asked for
help sending this to the list. I provide no warranties or refunds ;)
---
All zvals passed into the engine must be allocated by the mm, you cannot
pemalloc anything and pass it into the engine safely.
You don't want to store a persistent zval, you want to store a persistent
resource entry, which should be allocated with pemalloc(size, 1)
The reason for this is when cleaning up, the engine has no means by which
to tell if a zval has been pemalloc or emalloc'd, zval_ptr_dtor works the
same for everything.
Cheers
Joe
Thread (14 messages)