Changeset 1563 in svn


Ignore:
Timestamp:
2014-11-11T05:41:45Z (4 years ago)
Author:
Xuefer
Message:

PHP_4: fix segv on module shutdown

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/xcache.c

    r1551 r1563  
    717717#endif
    718718
     719static zend_bool xc_is_xcache(const char *name) /* {{{ */
     720{
     721    return strcmp(name, XCACHE_NAME) == 0 || strncmp(name, XCACHE_NAME " ", sizeof(XCACHE_NAME " ") - 1) == 0;
     722}
     723/* }}} */
    719724/* {{{ incompatible zend extensions handling */
    720725typedef struct {
     
    791796        ext = (zend_extension *) element->data;
    792797
    793         if (!(strcmp(ext->name, XCACHE_NAME) == 0 || strncmp(ext->name, XCACHE_NAME " ", sizeof(XCACHE_NAME " ") - 1) == 0)) {
     798        if (!xc_is_xcache(ext->name)) {
    794799            xc_zend_llist_add_element(&zend_extensions, element);
    795800            ++zend_extensions.count;
     
    990995    UNREGISTER_INI_ENTRIES();
    991996    xcache_zend_extension_remove(&xc_zend_extension_entry);
     997
     998#ifndef ZEND_ENGINE_2
     999    /* XCache main module is registered last of all XCache modules in PHP_4
     1000     * move handle to first XCache module to avoid early unload of this dll(so)
     1001     */
     1002    {
     1003        zend_module_entry *handle_holder = NULL, *first = NULL;
     1004        Bucket *p;
     1005       
     1006        for (p = module_registry.pListHead; p; p = p->pListNext) {
     1007            zend_module_entry *module = p->pData;
     1008            if (xc_is_xcache(module->name)) {
     1009                if (!first) {
     1010                    first = module;
     1011                }
     1012                if (module->handle) {
     1013                    handle_holder = module;
     1014                    break;
     1015                }
     1016            }
     1017        }
     1018
     1019        if (first && handle_holder && handle_holder != first) {
     1020            first->handle = handle_holder->handle;
     1021            handle_holder->handle = NULL;
     1022        }
     1023    }
     1024#endif
    9921025    return SUCCESS;
    9931026}
Note: See TracChangeset for help on using the changeset viewer.