From 735b24a7279f2af06de9aa270495872af502e1f2 Mon Sep 17 00:00:00 2001 From: Sara Golemon Date: Tue, 28 Oct 2003 23:56:57 +0000 Subject: [PATCH] Allow userfilter instantiation to programmatically fail by returning false. Equivalent of Cspace filter "failure" by returning NULL. --- ext/standard/user_filters.c | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/ext/standard/user_filters.c b/ext/standard/user_filters.c index f8933ead01..891055bbd4 100644 --- a/ext/standard/user_filters.c +++ b/ext/standard/user_filters.c @@ -118,6 +118,11 @@ static void userfilter_dtor(php_stream_filter *thisfilter TSRMLS_DC) zval *retval = NULL; zval **tmp; + if (obj == NULL) { + /* If there's no object associated then there's nothing to dispose of */ + return; + } + ZVAL_STRINGL(&func_name, "onclose", sizeof("onclose")-1, 0); call_user_function_ex(NULL, @@ -266,20 +271,12 @@ static php_stream_filter *user_filter_factory_create(const char *filtername, return NULL; } - ALLOC_INIT_ZVAL(zfilter); - ZEND_REGISTER_RESOURCE(zfilter, filter, le_userfilters); - /* create the object */ ALLOC_ZVAL(obj); object_init_ex(obj, fdat->ce); ZVAL_REFCOUNT(obj) = 1; PZVAL_IS_REF(obj) = 1; - /* set the filter property */ - filter->abstract = obj; - - add_property_zval(obj, "filter", zfilter); - /* filtername */ add_property_string(obj, "filtername", (char*)filtername, 1); @@ -300,8 +297,30 @@ static php_stream_filter *user_filter_factory_create(const char *filtername, 0, NULL, 0, NULL TSRMLS_CC); - if (retval) + if (retval) { + if (Z_TYPE_P(retval) == IS_BOOL && Z_LVAL_P(retval) == 0) { + /* User reported filter creation error "return false;" */ + zval_ptr_dtor(&retval); + + /* Kill the filter (safely) */ + filter->abstract = NULL; + php_stream_filter_free(filter TSRMLS_CC); + + /* Kill the object */ + zval_ptr_dtor(&obj); + + /* Report failure to filter_alloc */ + return NULL; + } zval_ptr_dtor(&retval); + } + + /* set the filter property, this will be used during cleanup */ + ALLOC_INIT_ZVAL(zfilter); + ZEND_REGISTER_RESOURCE(zfilter, filter, le_userfilters); + filter->abstract = obj; + add_property_zval(obj, "filter", zfilter); + return filter; } -- 2.50.1