Skip to content

Segmentation fault when converting immutable and mutable DateTime instances created using reflection #8471

Closed

Description

@hype09

Description

Reproduction

<?php

$reflection = new ReflectionClass('\DateTime');

$mutable = $reflection->newInstanceWithoutConstructor();
$immutable = \DateTimeImmutable::createFromMutable($mutable);

Resulted in this output:

Process exited with code 139.

https://3v4l.org/gg0dq

The segfault happens when converting an "incomplete" \DateTime to a \DateTimeImmutable instance and vice versa.

Background

I stumbled upon this during some unit test writing where my testing framework was unexpectedly mocking \DateTime objects for me. After debugging for a while I could narrow the cause down to the snippet above.

Solution

I'd love to attempt to provide a fix for this, but I am unsure as to the proper solution, implementation-wise: Should an error be thrown during the conversion, or during constructor-less creation of the reflection instance? Or maybe no errors at all and some "sane default" type of handling for creating DateTime instances via Reflection? Are there any precedents in the implementation for other internal classes in regards to this? Thanks in advance!

PHP Version

PHP 7.4 - PHP 8.1

Operating System

No response

Activity

  1. cmb69 commented on May 2, 2022

    @cmb69
    Member

    Should an error be thrown during the conversion, […]

    I think so. It looks like DATE_CHECK_INITIALIZED() checks are missing in the mentioned methods.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions