从C调用PHP函数后,扩展段出现段错误

时间:2019-03-01 09:47:47

标签: php php-extension

我正在尝试编写一个扩展,在做完事后回调PHP函数。为了检查可行性,我按照这篇文章进行操作:its definition

基本扩展正常。然后,我添加了如下代码来调用PHP函数:

<?
function from_ext($arg) {
  echo "In PHP:", $arg;
  return "hello";
}

echo hello_world();

?>

和调用PHP:

php -dextension=modules/hello.so test.php
In PHP:From extensionSegmentation fault: 11

它确实调用了PHP函数并可以看到该值,但此后抛出了Seg错误:

x[i]  y[j]  X[i,j]  Y[i,j]

我正在MacOS 10.12.6上尝试使用随附的PHP(5.6.30)。

有什么想法可以克服Seg故障吗?

1 个答案:

答案 0 :(得分:1)

您需要在堆栈上分配返回值zval。传递给call_user_function的指针必须为非NULL。这是一个可以解决该问题的补丁。

--- a/mnt/tmpdisk/a.c
+++ b/mnt/tmpdisk/b.c
@@ -5,7 +5,7 @@ PHP_FUNCTION(hello_world)
     ZVAL_STRING(&p1, "From extension", 1);
     zval *params = { &p1 };
     zend_uint param_count = 1;
-    zval *retval_ptr = NULL;
+    zval retval;

     zval function_name;
     INIT_ZVAL(function_name);
@@ -13,12 +13,11 @@ PHP_FUNCTION(hello_world)

     if (call_user_function(
             CG(function_table), NULL /* no object */, &function_name,
-            retval_ptr, param_count, &params TSRMLS_CC
+            &retval, param_count, &params TSRMLS_CC
         ) == SUCCESS
     ) {
         printf("Success returning from PHP");
-        if (retval_ptr)
-          zval_ptr_dtor(&retval_ptr);
+        zval_dtor(&retval);
     }

     /* don't forget to free the zvals */

传递指向堆栈分配的内存的指针非常好,因为PHP引擎永远不会在调用的任何地方捕获对返回值zval的引用(因为返回值在用户空间中未命名)。