diff options
author | Christoph M. Becker <cmbecker69@gmx.de> | 2020-10-30 15:49:48 +0100 |
---|---|---|
committer | Christoph M. Becker <cmbecker69@gmx.de> | 2020-10-30 15:49:48 +0100 |
commit | 72d9d9b88f2fbd98bc6dcf2c27e5cb0c868e91dd (patch) | |
tree | 1ebc7803aeb01054059714b8483bf8ffe3c01acf | |
parent | 085e16c30176d21ca2ee7b3b0e158ea0f2a7cb28 (diff) | |
parent | 0427dcb91300f993b80c3d77f348d5e1ffcb0d16 (diff) | |
download | php-git-72d9d9b88f2fbd98bc6dcf2c27e5cb0c868e91dd.tar.gz |
Merge branch 'PHP-7.4' into PHP-8.0
* PHP-7.4:
Fix bug79177.phpt wrt. JIT
-rw-r--r-- | ext/ffi/tests/bug79177.phpt | 51 | ||||
-rw-r--r-- | ext/zend_test/php_test.h | 13 | ||||
-rw-r--r-- | ext/zend_test/test.c | 6 |
3 files changed, 36 insertions, 34 deletions
diff --git a/ext/ffi/tests/bug79177.phpt b/ext/ffi/tests/bug79177.phpt index d764437b2d..0667faa52d 100644 --- a/ext/ffi/tests/bug79177.phpt +++ b/ext/ffi/tests/bug79177.phpt @@ -2,46 +2,41 @@ 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'); -} +if (!extension_loaded('ffi')) die('skip ffi extension not available'); +if (!extension_loaded('zend-test')) die('skip zend-test extension 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()); +require_once __DIR__ . '/utils.inc'; +$header = <<<HEADER +extern int *(*bug79177_cb)(void); +void bug79177(void); +HEADER; -echo "Before\n"; +if (PHP_OS_FAMILY !== 'Windows') { + $ffi = FFI::cdef($header); +} else { + try { + $ffi = FFI::cdef($header, 'php_zend_test.dll'); + } catch (FFI\Exception $ex) { + $ffi = FFI::cdef($header, ffi_get_php_dll_name()); + } +} -$originalHandler = clone $php->zend_write; -$php->zend_write = function($str, $len): string { +$ffi->bug79177_cb = function() { 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; -} + $ffi->bug79177(); // this is supposed to raise a fatal error +} catch (\Throwable $exception) {} +echo "done\n"; ?> --EXPECTF-- -Before - Warning: Uncaught RuntimeException: Not allowed in %s:%d Stack trace: -#0 %s(%d): {closure}('After\n', 6) -#1 {main} +#0 %s(%d): {closure}() +#1 %s(%d): FFI->bug79177() +#2 {main} thrown in %s on line %d Fatal error: Throwing from FFI callbacks is not allowed in %s on line %d diff --git a/ext/zend_test/php_test.h b/ext/zend_test/php_test.h index 5d9e31cc83..2a1d7763da 100644 --- a/ext/zend_test/php_test.h +++ b/ext/zend_test/php_test.h @@ -36,16 +36,17 @@ struct bug79096 { }; #ifdef PHP_WIN32 -# ifdef PHP_ZEND_TEST_EXPORTS -# define PHP_ZEND_TEST_API __declspec(dllexport) -# else -# define PHP_ZEND_TEST_API __declspec(dllimport) -# endif +# define PHP_ZEND_TEST_API __declspec(dllexport) +#elif defined(__GNUC__) && __GNUC__ >= 4 +# define PHP_ZEND_TEST_API __attribute__ ((visibility("default"))) #else -# define PHP_ZEND_TEST_API ZEND_API +# define PHP_ZEND_TEST_API #endif PHP_ZEND_TEST_API struct bug79096 bug79096(void); PHP_ZEND_TEST_API void bug79532(off_t *array, size_t elems); +extern PHP_ZEND_TEST_API int *(*bug79177_cb)(void); +PHP_ZEND_TEST_API void bug79177(void); + #endif diff --git a/ext/zend_test/test.c b/ext/zend_test/test.c index 083d77c739..08d91c361a 100644 --- a/ext/zend_test/test.c +++ b/ext/zend_test/test.c @@ -620,3 +620,9 @@ PHP_ZEND_TEST_API void bug79532(off_t *array, size_t elems) array[i] = i; } } + +PHP_ZEND_TEST_API int *(*bug79177_cb)(void); +void bug79177(void) +{ + bug79177_cb(); +} |