все связанные с exec функции PHP segfault - PullRequest
0 голосов
/ 29 марта 2012

Я строю PHP для Android, используя NDK. Большинство протестированных функций работают отлично, кроме ...

Все связанные с 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

Я заключаю
- exec из ls работает нормально
- результат ls в порядке

Еще что-то не так.

Вопрос 1:
Может кто-нибудь указать мне на раздел кода, где выполняется PHP_FUNCTION (shell_exec), поэтому я могу попытаться увидеть некоторые подробности того, где он идет не так

Вопрос 2:
Любые намеки на то, что может быть не так.

Информация о версии
Android 2.3.1
Android NDK 6
PHP 5.2.17

1 Ответ

1 голос
/ 05 апреля 2012

Спасибо анониму, который прислал мне электронное письмо с полезными советами.

Как оказалось, php использует popen для всего своего кода, связанного с exec. Некоторые могут знать, что бионическая версия popen для Android была довольно глючной, пока ICS не знала, что она повреждена в стеке.

Я модифицировал php, чтобы использовать модифицированную версию popen Теперь php exec / shell_exec и т. Д. Работают без проблем

...