Skip to content

main: change some PHP globals to zend_string* and uint32_t - #22814

Open
Girgias wants to merge 6 commits into
php:masterfrom
Girgias:2026-07-php_globals_zstr_conversion
Open

main: change some PHP globals to zend_string* and uint32_t#22814
Girgias wants to merge 6 commits into
php:masterfrom
Girgias:2026-07-php_globals_zstr_conversion

Conversation

@Girgias

@Girgias Girgias commented Jul 19, 2026

Copy link
Copy Markdown
Member

No description provided.

@Girgias
Girgias force-pushed the 2026-07-php_globals_zstr_conversion branch from d0b5cc4 to 9cc5fe0 Compare July 19, 2026 22:34
@Girgias
Girgias marked this pull request as ready for review July 20, 2026 08:54
@Girgias
Girgias requested a review from bukka as a code owner July 20, 2026 08:54
@Girgias
Girgias force-pushed the 2026-07-php_globals_zstr_conversion branch from 9cc5fe0 to 41e2f2a Compare July 20, 2026 09:14
@Girgias
Girgias requested a review from TimWolla July 20, 2026 13:33
@Girgias
Girgias requested a review from devnexen July 28, 2026 08:25
Comment thread ext/standard/var_unserializer.re Outdated

/* Call unserialize callback */
ZVAL_STRING(&user_func, PG(unserialize_callback_func));
ZVAL_STR(&user_func, PG(unserialize_callback_func));

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A test along these lines

function unserialize_cb_original($name)
{
    ini_set('unserialize_callback_func', 'unserialize_cb_changed');
}

function unserialize_cb_changed($name)
{
}

ini_set('unserialize_callback_func', 'unserialize_cb_original');

unserialize('O:3:"FOO":0:{}');

var_dump(ini_get('unserialize_callback_func'));

ini_restore('unserialize_callback_func');

var_dump(ini_get('unserialize_callback_func'));

along side with USE_ZEND_ALLOC=0 USE_TRACKED_ALLOC=1 should highlight the underlying refcount issue here.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I added the test to master and it still seems to work just fine?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see the issue as we are zval_dtor the zval... and yet it doesn't fail when not copying... I'm confused.

@devnexen devnexen Jul 29, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ah right ... I m afraid this is going to bite us down the road, I would prefer it copies wdyt ?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed, let me amend the commit.

Girgias added 6 commits July 29, 2026 15:30
As this is the expected type for lineno everywhere else in the engine
This remove a strlen() computation.

While at it clarify path concatenation code by using the zend_string_concat{2|3} APIs rather than a memcpy and strncpy calls
Allows us to convert a strcmp() call to zend_string_equals_literal() which is less confusing
@Girgias
Girgias force-pushed the 2026-07-php_globals_zstr_conversion branch from 41e2f2a to 67e3c4b Compare July 29, 2026 14:31
Comment thread main/fopen_wrappers.c
case 0:
filename = zend_string_concat3(
ZSTR_VAL(PG(doc_root)), ZSTR_LEN(PG(doc_root)),
ZEND_STRL("/"),

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: I just realise I wonder if PHP_DIR_SEPARATOR is not more appropriate

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants