Changeset 1576 in svn


Ignore:
Timestamp:
2014-11-12T18:55:52Z (4 years ago)
Author:
Xuefer
Message:

fix some xcache_get leak by refcount

Location:
trunk
Files:
3 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/processor/foot.m4

    r1572 r1576  
    125125    if (processor.handle_reference) {
    126126        zend_hash_init(&processor.zvalptrs, 0, NULL, NULL, 0);
    127         if (dst_ptr) {
    128             zval_ptr_dtor(dst_ptr);
    129         }
    130127    }
    131128    processor.index_to_ce = index_to_ce;
     
    145142    }
    146143#endif
     144    zval_ptr_dtor(&dst);
    147145    if (dst_ptr) {
    148146        xc_restore_zval_ptr(&processor, dst_ptr, &src->value TSRMLS_CC);
     147        Z_ADDREF(**dst_ptr);
    149148    }
    150149    else {
    151150        xc_restore_zval(&processor, dst, src->value TSRMLS_CC);
     151        Z_ADDREF(*dst);
    152152    }
    153153    if (processor.handle_reference) {
  • trunk/processor/processor.m4

    r1572 r1576  
    307307                    ')
    308308                    if (zend_hash_add(&processor->zvalptrs, (char *) &SRC()[0], sizeof(SRC()[0]), (void *) &pzv, sizeof(pzv), NULL) == SUCCESS) { /* first add, go on */
    309                         IFSTORE(`Z_SET_REFCOUNT(**DST(), 1);')
    310309                        dnl IFSTORE(`fprintf(stderr, "mark[%p] = %p\n", (void *) SRC()[0], (void *) pzv);')
    311310                    }
     
    320319            IFDPRINT(`INDENT()`'fprintf(stderr, "[%p] ", (void *) SRC()[0]);')
    321320            STRUCT_P_EX(zval, DST()[0], SRC()[0], `[0]', `', ` ')
     321            dnl don't set refcount in zval processor
     322            IFSTORE(`Z_SET_REFCOUNT(**DST(), 1);')
    322323            RELOCATE_EX(zval, DST()[0])
    323324        } while (0);
     
    14191420    IFDPRINT(`INDENT()`'fprintf(stderr, "zval:value");')
    14201421    STRUCT_P_EX(zval_ptr, DST(`value'), SRC(`value'), `value', `', `&')
     1422    DONE(value)
    14211423#if 0
    14221424    IFSTORE(`
     
    14251427        zval **zv;
    14261428
    1427         assert(Z_TYPE_P(SRC(`value')) == IS_ARRAY);
    1428         ht = Z_ARRVAL_P(SRC(`value'));
     1429        assert(Z_TYPE_P(DST(`value')) == IS_ARRAY);
     1430        ht = Z_ARRVAL_P(DST(`value'));
    14291431        assert(ht->nNumOfElements == 1);
    14301432        fprintf(stderr, "key %s\n", ht->pListHead->arKey);
    14311433
    14321434        zv = (zval **) ht->pListHead->pData;
    1433         fprintf(stderr, "%d\n", Z_TYPE_PP(zv));
    14341435        assert(Z_TYPE_PP(zv) == IS_ARRAY);
    14351436        assert(Z_ARRVAL_PP(zv) == ht);
     1437        fprintf(stderr, "refcount=%d\n", Z_REFCOUNT(*DST(`value')));
     1438        fprintf(stderr, "refcount=%d\n", Z_REFCOUNT(**zv));
    14361439    }
    14371440    ')
     
    14831486
    14841487    PROCESS(zend_bool, have_references)
    1485     DONE(value)
    14861488')
    14871489dnl }}}
  • trunk/tests/xcache_var_object.phpt

    r1569 r1576  
    11--TEST--
    2 xcache_set/get test for object
     2xcache_set/get test for object PHP 5.2+
    33--SKIPIF--
    44<?php
    55require("skipif.inc");
     6if (!version_compare(phpversion(), '5.2', '>=')) {
     7    echo 'skip for PHP 5.2+ only';
     8}
    69?>
    710--INI--
  • trunk/tests/xcache_var_reference.phpt

    r1572 r1576  
    11--TEST--
    2 xcache_set/get test for reference
     2xcache_set/get test for reference for PHP 5.2+
    33--SKIPIF--
    44<?php
    55require("skipif.inc");
     6if (!version_compare(phpversion(), '5.2', '>=')) {
     7    echo 'skip for PHP 5.2+ only';
     8}
    69?>
    710--INI--
Note: See TracChangeset for help on using the changeset viewer.