On Tue, Jul 22, 2014 at 6:20 PM, Julien Pauli <jpa...@php.net> wrote:

> On Tue, Jul 22, 2014 at 2:04 PM, Ferenc Kovacs <tyr...@gmail.com> wrote:
> >
> >
> >
> > On Tue, Jul 22, 2014 at 1:48 PM, Nikita Popov <nikita....@gmail.com>
> wrote:
> >>
> >> On Tue, Jul 22, 2014 at 12:27 PM, Ferenc Kovacs <tyr...@gmail.com>
> wrote:
> >>>
> >>> sorry for the late reply.
> >>> you are right and after looking into the implementation I think classes
> >>> having custom object storage (eg. create_object) shouldn't assume that
> >>> their __construct will be called, but either do the initialization in
> the
> >>> create_object hook or validate in the other methods that the object was
> >>> properly initialized.
> >>> given that this lack of initialization problem is already present(you
> can
> >>> extend such a class and have a __construct() in the subclass which
> >>> doesn't
> >>> call the parent constructor), and we want to keep the unserialize trick
> >>> fixed (as that exposes this problems to the remote attacker when some
> >>> code
> >>> accepts arbitrary serialized data from the client) I see no reason to
> >>> keep
> >>> the limitation in the ReflectionClass::newInstanceWithoutConstructor()
> >>> and
> >>> allowing the instantiation of internal classes will provide a clean
> >>> upgrade
> >>> path to doctrine and co.
> >>> ofc. we have to fix the internal classes misusing the constructor for
> >>> proper initialization one by one, but that can happen after the initial
> >>> 5.6.0 release (ofc it would be wonderful if people could lend me a hand
> >>> for
> >>> fixing as much as we can before the release), but we have to fix those
> >>> anyways.
> >>
> >>
> >> This sounds reasonable to me. newInstanceWithoutConstructor does not
> have
> >> the same remote exploitation concerns as serialize, so allowing crashes
> here
> >> that can also be caused by other means seems okay to me (especially if
> we're
> >> planning to fix them lateron). Only additional restriction I'd add is to
> >> disallow calling it on an internal + final class. For those the
> __construct
> >> argument does not apply. For them the entity-extending-internal-class
> >> usecase doesn't apply either, so that shouldn't be a problem.
> >>
> >> Nikita
> >>
> >
> > Thanks for the prompt reply!
> > I was considering mentioning the final constructors, but as we previously
> > didn't checked that and from a quick look it seems that we are mostly
> using
> > it as an easy/cheap way to make sure that the object is initialized
> properly
> > (which could also happen when a subclass calls parent::__construct() from
> > it's constructor) which isn't exactly the best usecase for final.
> > But I don't really mind having that check.
>
> I'm +1 also with the idea.
>
> Just take care to have a clone_handler defined as well, as the default
> clone handler doesn't call create_object.
> http://lxr.php.net/xref/PHP_5_5/Zend/zend_objects.c#218
>
> Julien
>

thanks, I will keep that in mind when we start moving the initialization
from the constructors into the create_object functions.
I've also went ahead and created a pull request for the proposed changes:
https://github.com/php/php-src/pull/733
as you can see I've taken Nikita's advice and internal classes with final
constructors are still not allowed to be instantiated.

-- 
Ferenc Kovács
@Tyr43l - http://tyrael.hu

Reply via email to