Re: Re: How to create Persistent zval?

From: Date: Sat, 18 Jan 2014 20:12:11 +0000
Subject: Re: Re: How to create Persistent zval?
References: 1 2 3  Groups: php.internals 
Request: Send a blank email to internals+get-71252@lists.php.net to get a copy of this message
On Sat, Jan 18, 2014 at 9:01 PM, Lin Yo-An <cornelius.howl@gmail.com> wrote: > By the way, Is this the reason of date ext always check the global > HashTable and re-initialize the tzdata in every request? > > Lin Yo-An <cornelius.howl@gmail.com> 於 2014年1月19日星期日寫道: > >> >> >> Daniel Lowrey <rdlowrey@php.net <javascript:_e({}, 'cvml', >> 'rdlowrey@php.net');>> 於 2014年1月19日星期日寫道: >> >>> >> 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. >> >> >> >> Thank you so much! That is what i was guessing.. - ref cnt and pemalloc >> does not work for persistent zval. >> >> And zend engine cleans up zvals at the end of request no matter the ref >> cnt is? >> >> so zval is not persistent, then is HashTable persistent? >> >> It's because I need to store a zval object which has several properties. >> Is there a way to do make the object persistent? Or do i need to serialize >> it just like apc? Read the shutdown sequence, and you will figure it out by yourself. Non-persistent pointers are freed at request shutdown. http://lxr.php.net/xref/PHP_5_5/Zend/zend_alloc.c#1601 Julien

« previous php.internals (#71252) next »