php extension fix free object bug in PHP 7

pull/96/head
yuqing 2016-12-29 10:06:10 +08:00
parent 16f33458b8
commit 4a57692c72
2 changed files with 19 additions and 47 deletions

View File

@ -1,7 +1,8 @@
Version 5.09 2016-11-10
Version 5.09 2016-12-29
* bug fixed: list_all_groups expand buffer auto for so many groups
* tracker.conf add parameters: min_buff_size and max_buff_size
* php extension fix free object bug in PHP 7
Version 5.08 2016-04-08
* install library to $(TARGET_PREFIX)/lib anyway

View File

@ -62,15 +62,11 @@ typedef struct
static int php_fdfs_download_callback(void *arg, const int64_t file_size, \
const char *data, const int current_size);
static void php_fdfs_free_storage(php_fdfs_t *i_obj);
static FDFSConfigInfo *config_list = NULL;
static int config_count = 0;
static FDFSPhpContext php_context = {&g_tracker_group, 0};
static int le_fdfs;
static zend_class_entry *fdfs_ce = NULL;
static zend_class_entry *fdfs_exception_ce = NULL;
@ -5373,28 +5369,6 @@ static void php_fdfs_destroy(php_fdfs_t *i_obj TSRMLS_DC)
efree(i_obj->context.pTrackerGroup);
i_obj->context.pTrackerGroup = NULL;
}
efree(i_obj);
}
ZEND_RSRC_DTOR_FUNC(php_fdfs_dtor)
{
#if PHP_MAJOR_VERSION < 7
if (rsrc->ptr != NULL)
{
php_fdfs_t *i_obj = (php_fdfs_t *)rsrc->ptr;
php_fdfs_destroy(i_obj TSRMLS_CC);
rsrc->ptr = NULL;
}
#else
if (res->ptr != NULL)
{
php_fdfs_t *i_obj = (php_fdfs_t *)res->ptr;
php_fdfs_destroy(i_obj TSRMLS_CC);
res->ptr = NULL;
}
#endif
}
/* FastDFS::__construct([int config_index = 0, bool bMultiThread = false])
@ -5455,15 +5429,6 @@ static PHP_METHOD(FastDFS, __construct)
}
}
static PHP_METHOD(FastDFS, __destruct)
{
zval *object = getThis();
php_fdfs_t *i_obj;
i_obj = (php_fdfs_t *) fdfs_get_object(object);
php_fdfs_free_storage(i_obj);
}
/*
array FastDFS::tracker_get_connection()
return array for success, false for error
@ -6574,9 +6539,6 @@ ZEND_ARG_INFO(0, config_index)
ZEND_ARG_INFO(0, bMultiThread)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo___destruct, 0, 0, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_tracker_get_connection, 0, 0, 0)
ZEND_END_ARG_INFO()
@ -7077,7 +7039,6 @@ ZEND_END_ARG_INFO()
#define FDFS_ME(name, args) PHP_ME(FastDFS, name, args, ZEND_ACC_PUBLIC)
static zend_function_entry fdfs_class_methods[] = {
FDFS_ME(__construct, arginfo___construct)
FDFS_ME(__destruct, arginfo___destruct)
FDFS_ME(tracker_get_connection, arginfo_tracker_get_connection)
FDFS_ME(tracker_make_all_connections, arginfo_tracker_make_all_connections)
FDFS_ME(tracker_close_all_connections,arginfo_tracker_close_all_connections)
@ -7153,11 +7114,23 @@ static zend_function_entry fdfs_class_methods[] = {
#undef FDFS_ME
/* }}} */
static void php_fdfs_free_storage(php_fdfs_t *i_obj)
#if PHP_MAJOR_VERSION < 7
static void php_fdfs_free_storage(void *object TSRMLS_DC)
{
php_fdfs_t *i_obj = (php_fdfs_t *)object;
zend_object_std_dtor(&i_obj->zo TSRMLS_CC);
php_fdfs_destroy(i_obj TSRMLS_CC);
efree(i_obj);
}
#else
static void php_fdfs_free_storage(zend_object *object)
{
php_fdfs_t *i_obj = (php_fdfs_t *)((char*)(object) -
XtOffsetOf(php_fdfs_t , zo));
zend_object_std_dtor(&i_obj->zo TSRMLS_CC);
php_fdfs_destroy(i_obj TSRMLS_CC);
}
#endif
#if PHP_MAJOR_VERSION < 7
zend_object_value php_fdfs_new(zend_class_entry *ce TSRMLS_DC)
@ -7170,7 +7143,7 @@ zend_object_value php_fdfs_new(zend_class_entry *ce TSRMLS_DC)
zend_object_std_init(&i_obj->zo, ce TSRMLS_CC);
retval.handle = zend_objects_store_put(i_obj, \
(zend_objects_store_dtor_t)zend_objects_destroy_object, \
NULL, NULL TSRMLS_CC);
php_fdfs_free_storage, NULL TSRMLS_CC);
retval.handlers = zend_get_std_object_handlers();
return retval;
@ -7517,15 +7490,13 @@ PHP_MINIT_FUNCTION(fastdfs_client)
}
#if PHP_MAJOR_VERSION >= 7
memcpy(&fdfs_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
memcpy(&fdfs_object_handlers, zend_get_std_object_handlers(),
sizeof(zend_object_handlers));
fdfs_object_handlers.offset = XtOffsetOf(php_fdfs_t, zo);
fdfs_object_handlers.free_obj = NULL;
fdfs_object_handlers.free_obj = php_fdfs_free_storage;
fdfs_object_handlers.clone_obj = NULL;
#endif
le_fdfs = zend_register_list_destructors_ex(NULL, php_fdfs_dtor, \
"FastDFS", module_number);
INIT_CLASS_ENTRY(ce, "FastDFS", fdfs_class_methods);
fdfs_ce = zend_register_internal_class(&ce TSRMLS_CC);
fdfs_ce->create_object = php_fdfs_new;