@@ -452,7 +452,15 @@ static void dba_close_rsrc(zend_resource *rsrc)
452
452
/* {{{ dba_close_pe_rsrc_deleter */
453
453
int dba_close_pe_rsrc_deleter (zval * el , void * pDba )
454
454
{
455
- return ((zend_resource * )Z_PTR_P (el ))-> ptr == pDba ? ZEND_HASH_APPLY_REMOVE : ZEND_HASH_APPLY_KEEP ;
455
+ if (Z_RES_P (el )-> ptr == pDba ) {
456
+ if (Z_DELREF_P (el ) == 0 ) {
457
+ return ZEND_HASH_APPLY_REMOVE ;
458
+ } else {
459
+ return ZEND_HASH_APPLY_KEEP | ZEND_HASH_APPLY_STOP ;
460
+ }
461
+ } else {
462
+ return ZEND_HASH_APPLY_KEEP ;
463
+ }
456
464
}
457
465
/* }}} */
458
466
@@ -675,7 +683,7 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, int persistent)
675
683
info = (dba_info * )le -> ptr ;
676
684
677
685
GC_REFCOUNT (le )++ ;
678
- RETURN_RES (le );
686
+ RETURN_RES (zend_register_resource ( info , le_pdb ) );
679
687
return ;
680
688
}
681
689
}
@@ -933,11 +941,10 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, int persistent)
933
941
info -> argv = NULL ;
934
942
935
943
if (persistent ) {
936
- zend_resource new_le ;
944
+ zval new_le ;
937
945
938
- new_le .type = le_pdb ;
939
- new_le .ptr = info ;
940
- if (zend_hash_str_update_mem (& EG (persistent_list ), key , keylen , & new_le , sizeof (zend_resource )) == NULL ) {
946
+ ZVAL_NEW_PERSISTENT_RES (& new_le , -1 , info , le_pdb );
947
+ if (zend_hash_str_update (& EG (persistent_list ), key , keylen , & new_le ) == NULL ) {
941
948
dba_close (info );
942
949
php_error_docref2 (NULL , Z_STRVAL (args [0 ]), Z_STRVAL (args [1 ]), E_WARNING , "Could not register persistent resource" );
943
950
FREENOW ;
0 commit comments