所有exec相关的PHP函数段错误

时间:2012-03-29 09:22:37

标签: php android segmentation-fault shell-exec

我使用NDK为Android构建PHP。到目前为止测试的大多数功能都运行得很好,除了......

所有exec相关的php函数(如exec,shell_exec,popen,..)都是sefgault。

php示例代码(test.php)

<?php
$s=shell_exec("ls");
echo $s
?>

结果:

# php test.php
[1]   Segmentation fault

我在内部shell_exec函数中添加了一些调试代码

PHP_FUNCTION(shell_exec)
{
    FILE *in;
    size_t total_readbytes;
    zval **cmd;
    char *ret;
    php_stream *stream;

    if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1, &cmd)==FAILURE) {
            WRONG_PARAM_COUNT;
    }

    if (PG(safe_mode)) {
            php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot execute using backquotes in Safe Mode");
            RETURN_FALSE;
    }

    convert_to_string_ex(cmd);
#ifdef PHP_WIN32
    if ((in=VCWD_POPEN(Z_STRVAL_PP(cmd), "rt"))==NULL) {
#else
    if ((in=VCWD_POPEN(Z_STRVAL_PP(cmd), "r"))==NULL) {
#endif
            php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to execute '%s'", Z_STRVAL_PP(cmd));
            RETURN_FALSE;
    }

    stream = php_stream_fopen_from_pipe(in, "rb");
    total_readbytes = php_stream_copy_to_mem(stream, &ret, PHP_STREAM_COPY_ALL, 0);
    php_stream_close(stream);

    printf("TEST\n%s\n",ret);

    if (total_readbytes > 0) {
            RETURN_STRINGL(ret, total_readbytes, 0);
    } else {
            RETURN_NULL();
    }
}

结果

# php test.php
TEST
test.php
[1]   Segmentation fault

我总结道
- ls的执行官工作正常
- ls的结果是好的

还是出了点问题。

问题1:
有人可以指向我执行PHP_FUNCTION(shell_exec)的代码部分,所以我可以尝试查看更多错误的详细信息

问题2:
任何可能出错的提示。

版本信息
Android 2.3.1
Android NDK 6
PHP 5.2.17

1 个答案:

答案 0 :(得分:1)

向匿名者发送电子邮件,向我发送一些有用的提示。

事实证明,php使用popen作为其exec相关代码。 一些人可能知道机器人仿生版的popen在ICS之前是非常错误的并且它知道腐败堆栈。

我修改了php以使用修改过的popen版本 现在php exec / shell_exec等都运行没有任何问题