chregu          Sun Aug  8 14:05:47 2004 EDT

  Modified files:              (Branch: PHP_5_0)
    /php-src/ext/xsl    xsltprocessor.c 
  Log:
  MFH (fix for Bug #29573 : Segmentation fault when php function(called from XSLT 
templat) throw exception
  and Zero Byte Memory Leaks)
  
  
http://cvs.php.net/diff.php/php-src/ext/xsl/xsltprocessor.c?r1=1.29.2.1&r2=1.29.2.2&ty=u
Index: php-src/ext/xsl/xsltprocessor.c
diff -u php-src/ext/xsl/xsltprocessor.c:1.29.2.1 
php-src/ext/xsl/xsltprocessor.c:1.29.2.2
--- php-src/ext/xsl/xsltprocessor.c:1.29.2.1    Wed Jul 28 08:42:16 2004
+++ php-src/ext/xsl/xsltprocessor.c     Sun Aug  8 14:05:47 2004
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: xsltprocessor.c,v 1.29.2.1 2004/07/28 12:42:16 chregu Exp $ */
+/* $Id: xsltprocessor.c,v 1.29.2.2 2004/08/08 18:05:47 chregu Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -156,9 +156,10 @@
        }
 
        fci.param_count = nargs - 1;
-       fci.params = safe_emalloc(fci.param_count, sizeof(zval**), 0);
-
-       args = safe_emalloc(nargs - 1, sizeof(zval *), 0);
+       if (fci.param_count > 0) {
+               fci.params = safe_emalloc(fci.param_count, sizeof(zval**), 0);
+               args = safe_emalloc(nargs - 1, sizeof(zval *), 0);
+       }
        /* Reverse order to pop values off ctxt stack */
        for (i = nargs - 2; i >= 0; i--) {
                obj = valuePop(ctxt);
@@ -229,11 +230,13 @@
        if (obj->stringval == NULL) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Handler name must be a 
string");
                xmlXPathFreeObject(obj);
-               for (i = 0; i < nargs - 1; i++) {
-                       zval_ptr_dtor(&args[i]);
+               if (fci.param_count > 0) {
+                       for (i = 0; i < nargs - 1; i++) {
+                               zval_ptr_dtor(&args[i]);
+                       }
+                       efree(args);
+                       efree(fci.params);
                }
-               efree(args);
-               efree(fci.params);
                return; 
        }
        INIT_PZVAL(&handler);
@@ -254,7 +257,9 @@
                if (result == FAILURE) {
                        if (Z_TYPE(handler) == IS_STRING) {
                                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to 
call handler %s()", Z_STRVAL_P(&handler));
-                       } 
+                       }
+               /* retval is == NULL, when an exception occured, don't report 
anything, because PHP itself will handle that */
+               } else if (retval == NULL) {
                } else {
                        if (retval->type == IS_OBJECT && instanceof_function( 
Z_OBJCE_P(retval), dom_node_class_entry TSRMLS_CC)) {
                                xmlNode *nodep;
@@ -283,11 +288,13 @@
        }
        efree(callable);
        zval_dtor(&handler);
-       for (i = 0; i < nargs - 1; i++) {
-               zval_ptr_dtor(&args[i]);
+       if (fci.param_count > 0) {
+               for (i = 0; i < nargs - 1; i++) {
+                       zval_ptr_dtor(&args[i]);
+               }
+               efree(args);
+               efree(fci.params);
        }
-       efree(args);
-       efree(fci.params);
 }
 
 static void xsl_ext_function_string_php(xmlXPathParserContextPtr ctxt, int nargs)

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to