summaryrefslogtreecommitdiffstats
path: root/engine_api.c
diff options
context:
space:
mode:
authorRemi Collet <remi@remirepo.net>2020-07-09 08:48:18 +0200
committerRemi Collet <remi@remirepo.net>2020-07-09 08:48:18 +0200
commit33968e12fc2c455056f41a5748117c7b37c77217 (patch)
tree517a73208c8529a061d2889905c08dd269613333 /engine_api.c
parent6aa9fbd1a0f28dbb18f8a2cd045e38f4c6c9e8b6 (diff)
update to 0.47.0
open https://github.com/DataDog/dd-trace-php/pull/952 improve CGI usage in test suite open https://github.com/DataDog/dd-trace-php/issues/953 missing files in 0.47.0 archive
Diffstat (limited to 'engine_api.c')
-rw-r--r--engine_api.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/engine_api.c b/engine_api.c
new file mode 100644
index 0000000..05cfe15
--- /dev/null
+++ b/engine_api.c
@@ -0,0 +1,39 @@
+#include "engine_api.h"
+
+#include "engine_hooks.h" // for ddtrace_backup_error_handling
+
+int ddtrace_call_sandboxed_function(const char *name, size_t name_len, zval **retval, int argc,
+ zval **argv[] TSRMLS_DC) {
+ zval *fname;
+ MAKE_STD_ZVAL(fname);
+ ZVAL_STRINGL(fname, name, name_len, 1);
+ zend_fcall_info fci;
+ zend_fcall_info_cache fcc;
+
+ // Play it safe if an exception has not been handled yet
+ if (EG(exception)) {
+ return FAILURE;
+ }
+
+ ddtrace_error_handling eh;
+ ddtrace_backup_error_handling(&eh, EH_SUPPRESS TSRMLS_CC);
+
+ int result = zend_fcall_info_init(fname, IS_CALLABLE_CHECK_SILENT, &fci, &fcc, NULL, NULL TSRMLS_CC);
+ if (result == SUCCESS) {
+ fci.retval_ptr_ptr = retval;
+ fci.params = argv;
+ fci.no_separation = 0; // allow for by-ref args
+ fci.param_count = argc;
+ result = zend_call_function(&fci, &fcc TSRMLS_CC);
+ }
+
+ ddtrace_restore_error_handling(&eh TSRMLS_CC);
+
+ if (EG(exception)) {
+ zend_clear_exception(TSRMLS_C);
+ }
+
+ zval_dtor(fname);
+ efree(fname);
+ return result;
+}