Re: com php-src: Fixed bug #72286 (Segmentation fault During Garbage Collection): NEWS Zend/tests/bug72286.phpt Zend/zend_gc.c
| From: | Nikita Popov | Date: | Sat, 16 Jul 2016 21:20:20 +0000 |
| Subject: | Re: com php-src: Fixed bug #72286 (Segmentation fault During Garbage Collection): NEWS Zend/tests/bug72286.phpt Zend/zend_gc.c | ||
| References: | 1 2 | Groups: | php.cvs |
| Request: | Send a blank email to php-cvs+get-93049@lists.php.net to get a copy of this message | ||
Commit reverted via
https://github.com/php/php-src/commit/171c759d791f809ebc31711fd0b0b5bb632cd2cc
.
Nikita
On Sat, Jul 16, 2016 at 5:21 PM, Matteo Beccati <php@beccati.com> wrote:
> Hi Dmitry,
>
> I've just tried, but I do not have karma for the Zend directory, so my
> push has been rejected. I'm afraid someone else has to do it.
>
> BTW, are you suggesting to revert it up to master or just in the 5.6
> branch?
>
>
> Cheers
>
> On 16/07/2016 14:29, Dmitry Stogov wrote:
> > Hi Matteo,
> >
> > Please revert the patch. I can't do it myself now.
> > Xinchen, could you please try to look into the problem.
> >
> > Thanks. Dmitry.
> >
> > On Jul 15, 2016 4:28 PM, Matteo Beccati <php@beccati.com> wrote:
> >
> > >
> >
> >> Hi Dmitry,
> >>
> >> Pretty much all the application test suites I'm running were failing
> >> this morning due to segmentation faults on PHP-5.6 only, e.g.:
> >>
> >>
> >> https://revive.beccati.com/bamboo/browse/PHP-PHPSPEC-PHP56-772
> >
> > <https://revive.beccati.com/bamboo/browse/PHP-PHPSPEC-PHP56-772>
> >>
> >> If I revert this commit, the tests get green again. The easiest way to
> >> replicate is to get phpspec master and running its own test suite:
> >> "bin/phpspec run".
> >>
> >>
> >> Cheers
> >>
> >> On 14/07/2016 21:37, Dmitry Stogov wrote:
> >> > Commit: 1c84b55adea936b065a20102202bea3d1d243225
> >> > Author: Dmitry Stogov <dmitry@zend.com> Thu, 14 Jul 2016
> > 22:37:25 +0300
> >> > Parents: d0c98366d08d96e3b364e744fca76cc98a0d7f15
> >> > Branches: PHP-5.6 PHP-7.0 master
> >> >
> >> >
> > Link:
>
> http://git.php.net/?p=php-src.git;a=commitdiff;h=1c84b55adea936b065a20102202bea3d1d243225
> > <
>
> http://git.php.net/?p=php-src.git;a=commitdiff;h=1c84b55adea936b065a20102202bea3d1d243225
> >
> >> >
> >> > Log:
> >> > Fixed bug #72286 (Segmentation fault During Garbage Collection)
> >> >
> >> > Bugs:
> >> >https://bugs.php.net/72286
> >> ><https://bugs.php.net/72286>
> >> >
> >> > Changed paths:
> >> > M NEWS
> >> > A Zend/tests/bug72286.phpt
> >> > M Zend/zend_gc.c
> >> >
> >> >
> >> > Diff:
> >> > diff --git a/NEWS b/NEWS
> >> > index a9d242b..a9ca67a 100644
> >> > --- a/NEWS
> >> > +++ b/NEWS
> >> > @@ -5,6 +5,7 @@
> > PHP
> > NEWS
> >> > - Core:
> >> > . Fixed bug #72581 (previous property undefined in Exception after
> >> > deserialization). (Laruence)
> >> > + . Fixed bug #72286 (Segmentation fault During Garbage
> > Collection). (Dmitry)
> >> > . Fixed bug #72024 (microtime() leaks memory). (maroszek at gmx
> > dot net)
> >> >
> >> > - Curl:
> >> > diff --git a/Zend/tests/bug72286.phpt b/Zend/tests/bug72286.phpt
> >> > new file mode 100644
> >> > index 0000000..0f6184d
> >> > --- /dev/null
> >> > +++ b/Zend/tests/bug72286.phpt
> >> > @@ -0,0 +1,51 @@
> >> > +--TEST--
> >> > +Bug #72286 (Segmentation fault During Garbage Collection)
> >> > +--FILE--
> >> > +<?php
> >> > +class SegfaultScenario
> >> > +{
> >> > + private $circular_reference;
> >> > + private $object;
> >> > +
> >> > + public function __construct()
> >> > + {
> >> > + $this->circular_reference = $this;
> >> > + $this->object = new \stdClass();
> >> > + }
> >> > +
> >> > + public function __destruct()
> >> > + {
> >> > + // we try to avoid accessing $this->object by returning
> > early but the object exists
> >> > + if (!$this->object) { // without this expression involving
> > the object, the segfault does not happen
> >> > + var_dump('the object exists');
> >> > + return;
> >> > + }
> >> > +
> >> > + var_dump('segfaults here:');
> >> > + // and then access the object (which seemingly has already
> > been garbage collected)
> >> > + var_dump($this->object);
> >> > + var_dump('will not get here');
> >> > + }
> >> > +}
> >> > +
> >> > +class SomeContainer
> >> > +{
> >> > + public function run()
> >> > + {
> >> > + new SegfaultScenario();
> >> > + }
> >> > +}
> >> > +
> >> > +$container = new SomeContainer();
> >> > +$container->run();
> >> > +
> >> > +var_dump('we are about to segfault');
> >> > +gc_collect_cycles();
> >> > +var_dump('will not get here');
> >> > +--EXPECTF--
> >> > +string(24) "we are about to segfault"
> >> > +string(15) "segfaults here:"
> >> > +object(stdClass)#%d (0) {
> >> > +}
> >> > +string(17) "will not get here"
> >> > +string(17) "will not get here"
> >> > diff --git a/Zend/zend_gc.c b/Zend/zend_gc.c
> >> > index e72655c..7ad7340 100644
> >> > --- a/Zend/zend_gc.c
> >> > +++ b/Zend/zend_gc.c
> >> > @@ -650,6 +650,7 @@ tail_call:
> >> >
> >> > if (!props) {
> >> > /* restore refcount
> > and put into list to free */
> >> > + obj->refcount = 1;
> >> > pz->refcount__gc++;
> >> >
> > ((zval_gc_info*)pz)->u.next = GC_G(zval_to_free);
> >> > GC_G(zval_to_free) =
> > (zval_gc_info*)pz;
> >> > @@ -756,6 +757,7 @@ static void gc_collect_roots(TSRMLS_D)
> >> > struct _store_object *obj =
> > &EG(objects_store).object_buckets[current->handle].bucket.obj;
> >> > zval z;
> >> >
> >> > + obj->refcount = 1;
> >> > GC_SET_ADDRESS(obj->buffered, NULL);
> >> > INIT_PZVAL(&z);
> >> > Z_OBJ_HANDLE(z) = current->handle;
> >> > @@ -802,7 +804,7 @@ ZEND_API int gc_collect_cycles(TSRMLS_D)
> >> > if (Z_TYPE(p->z) == IS_OBJECT) {
> >> > if (EG(objects_store).object_buckets &&
> >> >
> > EG(objects_store).object_buckets[Z_OBJ_HANDLE(p->z)].valid &&
> >> > -
> > EG(objects_store).object_buckets[Z_OBJ_HANDLE(p->z)].bucket.obj.refcount
> > <= 0 &&
> >> > +
> > EG(objects_store).object_buckets[Z_OBJ_HANDLE(p->z)].bucket.obj.refcount
> > <= 1 &&
> >> >
> > EG(objects_store).object_buckets[Z_OBJ_HANDLE(p->z)].bucket.obj.dtor &&
> >> >
> > !EG(objects_store).object_buckets[Z_OBJ_HANDLE(p->z)].destructor_called)
> {
> >> >
> >> > @@ -823,7 +825,7 @@ ZEND_API int gc_collect_cycles(TSRMLS_D)
> >> > if (Z_TYPE(p->z) == IS_OBJECT) {
> >> > if (EG(objects_store).object_buckets &&
> >> >
> > EG(objects_store).object_buckets[Z_OBJ_HANDLE(p->z)].valid &&
> >> > -
> > EG(objects_store).object_buckets[Z_OBJ_HANDLE(p->z)].bucket.obj.refcount
> > <= 0) {
> >> > +
> >
> --EG(objects_store).object_buckets[Z_OBJ_HANDLE(p->z)].bucket.obj.refcount
> > <= 0) {
> >> >
> > EG(objects_store).object_buckets[Z_OBJ_HANDLE(p->z)].bucket.obj.refcount
> > = 1;
> >> > Z_TYPE(p->z) = IS_NULL;
> >> >
> > zend_objects_store_del_ref_by_handle_ex(Z_OBJ_HANDLE(p->z),
> > Z_OBJ_HT(p->z) TSRMLS_CC);
> >> >
> >> >
> >>
> >>
> >> --
> >> Matteo Beccati
> >>
> >> Development & Consulting -http://www.beccati.com/
> > <http://www.beccati.com/>
> >
>
>
> --
> Matteo Beccati
>
> Development & Consulting - http://www.beccati.com/
>
> --
> PHP CVS Mailing List (http://www.php.net/)
> To unsubscribe, visit: http://www.php.net/unsub.php
>