diff --git a/ext/session/session.c b/ext/session/session.c index 6b63999297205..74a0546b8490c 100644 --- a/ext/session/session.c +++ b/ext/session/session.c @@ -259,16 +259,17 @@ static zend_result php_session_decode(zend_string *data) /* {{{ */ php_error_docref(NULL, E_WARNING, "Unknown session.serialize_handler. Failed to decode session object"); return FAILURE; } + zend_result result = SUCCESS; zend_try { if (PS(serializer)->decode(ZSTR_VAL(data), ZSTR_LEN(data)) == FAILURE) { php_session_cancel_decode(); - return FAILURE; + result = FAILURE; } } zend_catch { php_session_cancel_decode(); zend_bailout(); } zend_end_try(); - return SUCCESS; + return result; } /* }}} */ diff --git a/ext/session/tests/gh13680.phpt b/ext/session/tests/gh13680.phpt new file mode 100644 index 0000000000000..a95583ee34598 --- /dev/null +++ b/ext/session/tests/gh13680.phpt @@ -0,0 +1,25 @@ +--TEST-- +GH-13680 (Segfault with session_decode and compilation error) +--EXTENSIONS-- +session +--SKIPIF-- + +--INI-- +session.use_cookies=0 +session.use_strict_mode=0 +session.cache_limiter= +session.serialize_handler=php_serialize +session.save_handler=files +error_reporting=E_ALL +--FILE-- + +--EXPECTF-- +Warning: session_decode(): Failed to decode session object. Session has been destroyed in %s on line %d + +Fatal error: Could not check compatibility between Test::createFromFormat($format, $datetime, $timezone = null): Wrong and DateTime::createFromFormat(string $format, string $datetime, ?DateTimeZone $timezone = null): DateTime|false, because class Wrong is not available in %s on line %d