Merge branch 'PHP-7.4' into PHP-8.0

* PHP-7.4:
  Fix #79177: FFI doesn't handle well PHP exceptions within callback
This commit is contained in:
Christoph M. Becker 2020-10-28 13:49:09 +01:00
commit d07f6753a0
3 changed files with 55 additions and 0 deletions

4
NEWS
View File

@ -2,6 +2,10 @@ PHP NEWS
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
?? ??? ????, PHP 8.0.0RC4
- FFI:
. Fixed bug #79177 (FFI doesn't handle well PHP exceptions within callback).
(cmb, Dmitry, Nikita)
- Opcache:
. Fixed run-time binding of preloaded dynamically declared function. (Dmitry)

View File

@ -885,6 +885,10 @@ static void zend_ffi_callback_trampoline(ffi_cif* cif, void* ret, void** args, v
}
free_alloca(fci.params, use_heap);
if (EG(exception)) {
zend_error(E_ERROR, "Throwing from FFI callbacks is not allowed");
}
ret_type = ZEND_FFI_TYPE(callback_data->type->func.ret_type);
if (ret_type->kind != ZEND_FFI_TYPE_VOID) {
zend_ffi_zval_to_cdata(ret, ret_type, &retval);

View File

@ -0,0 +1,47 @@
--TEST--
Bug #79177 (FFI doesn't handle well PHP exceptions within callback)
--SKIPIF--
<?php
require_once('skipif.inc');
require_once('utils.inc');
try {
ffi_cdef("extern void *zend_printf;", ffi_get_php_dll_name());
} catch (Throwable $e) {
die('skip PHP symbols not available');
}
?>
--FILE--
<?php
require_once('utils.inc');
$php = ffi_cdef("
typedef char (*zend_write_func_t)(const char *str, size_t str_length);
extern zend_write_func_t zend_write;
", ffi_get_php_dll_name());
echo "Before\n";
$originalHandler = clone $php->zend_write;
$php->zend_write = function($str, $len): string {
throw new \RuntimeException('Not allowed');
};
try {
echo "After\n";
} catch (\Throwable $exception) {
// Do not output anything here, as handler is overridden
} finally {
$php->zend_write = $originalHandler;
}
if (isset($exception)) {
echo $exception->getMessage(), PHP_EOL;
}
?>
--EXPECTF--
Before
Warning: Uncaught RuntimeException: Not allowed in %s:%d
Stack trace:
#0 %s(%d): {closure}('After\n', 6)
#1 {main}
thrown in %s on line %d
Fatal error: Throwing from FFI callbacks is not allowed in %s on line %d