PHP 7试图破坏从C延伸获得的资源产生Segfault



已经为PHP 5写了C延期,现在将其升级到PHP 7。

我根据Zend Framework的新需求修改了所有API调用,以便代码编译。将我的.SO文件放置在扩展位置,而PHP-FPM服务开始操作。

基本上,我从我的C扩展中请求自定义的标签(旧版代码),将其转换为ZVAL并在PHP中使用,然后随着范围结束,应调用其驱动器,但这里存在OME问题,我们在这里有问题,我们请参阅分段故障。

这是我的代码C-文件:

static int le_myResource;
#define le_myResource_name  "a myResource resource"
void myResource_destruction_handler(zval *rsrc TSRMLS_DC)
{
    myResource *d = (myResource *)zend_fetch_resource(Z_RES_P(rsrc), le_myResource_name, le_myResource);
    myResource_free(d);
}
rsrc_dtor_func_t myResource_destruction_handler;
le_myResource = zend_register_list_destructors_ex(myResource_destruction_handler, NULL, le_myResource_name, module_number);
ZEND_FUNCTION(myhash_new)
{
    myResource *d;
    d = myHash_new(); // my legacy project code returning a hash. The same way it returned to php5
    RETURN_RES(zend_register_resource(d, le_myResource));
}

这是调用PHP文件

<?php
class dbd {
    function query()
    {
        $reply = myhash_new()
        // use $reply
        // print statement here works
    }// this is where the problem occurs
}
?>

GDB堆栈显示以下内容:

Using host libthread_db library "/lib64/libthread_db.so.1".
Core was generated by `php-fpm: pool www                                                             '.
Program terminated with signal 11, Segmentation fault.
#0  0x0000000900000000 in ?? ()
Missing separate debuginfos, use: debuginfo-install ironwood-php-7.2.3.bfeature.B.88927_upgrade_to_php7-r20180313172814.9f25293.bLOCAL.x86_64
(gdb) bt
#0  0x0000000900000000 in ?? ()
#1  0x000000170000003e in ?? ()
#2  0x0000000001fb3250 in ?? ()
#3  0x0000000000000003 in ?? ()
#4  0x00007fbbff29e160 in ?? ()
#5  0x000000000079f8fa in list_entry_destructor ()
#6  0x00000000007971ba in zend_hash_index_del ()
#7  0x000000000084168f in zend_leave_helper_SPEC ()
#8  0x00000000007d4228 in execute_ex ()
#9  0x0000000000841327 in zend_execute ()
#10 0x0000000000787094 in zend_execute_scripts ()
#11 0x000000000071300e in php_execute_script ()
#12 0x000000000084ebfe in main ()

不确定如何控制第三方库生成的内存,然后避免被损坏。同一作品与PHP5一起使用。在www上进行了很多扫描,但无法破解它。任何指针都会有所帮助。

找到了问题。这是因为使用 rsrc_dtor_func_t 用于我的destructor函数。当我没有使用上述关键字时,我早些时候就有编译问题。

在myResource_destruction_handler中替换为zend_resource* ,然后将函数更改为 static void myResource_deStruction_handler(),以解决我所有问题。

到目前为止,我还没有遇到破坏级别的崩溃。

相关内容

  • 没有找到相关文章

最新更新