程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> php內核bug:動態鏈接方式編譯的擴展,擴展全局空間dtor導致core dump

php內核bug:動態鏈接方式編譯的擴展,擴展全局空間dtor導致core dump

編輯:PHP綜合

注冊擴展的全局空間代碼如下:

#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()

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved