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

Reply via email to