Re: Fwd: How to create Persistent zval?

From: Date: Sat, 18 Jan 2014 19:19:34 +0000
Subject: Re: Fwd: How to create Persistent zval?
Groups: php.internals 
Request: Send a blank email to [email protected] to get a copy of this message
>> 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)

« previous php.internals (#71249) next »