pollita Tue Oct 28 18:56:58 2003 EDT Modified files: /php-src/ext/standard user_filters.c Log: Allow userfilter instantiation to programmatically fail by returning false. Equivalent of Cspace filter "failure" by returning NULL. Index: php-src/ext/standard/user_filters.c diff -u php-src/ext/standard/user_filters.c:1.20 php-src/ext/standard/user_filters.c:1.21 --- php-src/ext/standard/user_filters.c:1.20 Thu Aug 7 15:53:31 2003 +++ php-src/ext/standard/user_filters.c Tue Oct 28 18:56:57 2003 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: user_filters.c,v 1.20 2003/08/07 19:53:31 moriyoshi Exp $ */ +/* $Id: user_filters.c,v 1.21 2003/10/28 23:56:57 pollita Exp $ */ #include "php.h" #include "php_globals.h" @@ -118,6 +118,11 @@ 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 @@ 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 @@ 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; }
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php