[php內核bug]動態鏈接方式編譯的擴展, 擴展全局空間dtor導致core dump
author: goosman.lei(雷果國)
blog: http://blog.csdn.net/lgg201
mail: [email protected]
相關代碼可以參考<php extending and embedding>一書第12章, "Extension Globals"一節.
註冊擴展的全局空間代碼如下:
#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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.