summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph M. Becker <cmbecker69@gmx.de>2020-10-30 15:49:48 +0100
committerChristoph M. Becker <cmbecker69@gmx.de>2020-10-30 15:49:48 +0100
commit72d9d9b88f2fbd98bc6dcf2c27e5cb0c868e91dd (patch)
tree1ebc7803aeb01054059714b8483bf8ffe3c01acf
parent085e16c30176d21ca2ee7b3b0e158ea0f2a7cb28 (diff)
parent0427dcb91300f993b80c3d77f348d5e1ffcb0d16 (diff)
downloadphp-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.phpt51
-rw-r--r--ext/zend_test/php_test.h13
-rw-r--r--ext/zend_test/test.c6
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();
+}