博学而笃志 切问而近思 仁在其中
详情
php内核bug:动态链接方式编译的扩展,扩展全局空间dtor导致core dump
作者:Aliot     发布时间:2017-07-02     评论:0     阅读:0

php内核bug:动态链接方式编译的扩展,扩展全局空间dtor导致core dump

时间:2013-09-10

注册扩展的全局空间代码如下:

#ifdef ZTS    ts_allocate_id(&sample_globals_id, sizeof(zend_sample_globals), (ts_allocate_ctor)ZEND_MODULE_GLOBALS_CTOR_N(sample), (ts_allocate_dtor)ZEND_MODULE_GLOBALS_DTOR_N(sample));#else    sample_globals_ctor(&sample_globals TSRMLS_CC);#endif

在ts_allocate_id()函数调用中, 向resource_types_table这个数组中写入了一条记录.

在tsrm_shutdown()的过程中, 将调用注册的dtor回调函数.

但是我这边在按照书上编码完后, 运行测试代码会有coredump.

经过跟踪发现, 在zend_shutdown()的调用过程中, 已经对模块调用了DL_UNLOAD(module->handle); 导致当时注册的句柄(dtor)在执行tsrm_shutdown()时已经不可访问.

同时, 看到标准扩展中的ext/standard/file.c中也有这种注册方式的使用, 不过, 它应该是静态编译所以没有问题. 而我的扩展是编译.so动态链接的.

下面是跟踪zend_shutdown()最终到DL_UNLOAD()的调用路径.

zend_shutdown()  => zend_desctroy_modules() => zend_hash_graceful_reverse_destroy() => zend_hash_apply_deleter() => module_destructor() => DL_UNLOAD()


相关文章
loading......
最新动态
所有评论

loading......

网站声明:
本站部分内容来自网络,如您发现本站内容
侵害到您的利益,请联系本站管理员处理。
联系站长
373515719@qq.com
关于本站:
编程参考手册