dmitry          Thu Jul  7 07:19:57 2005 EDT

  Modified files:              
    /php-src/ext/pdo    pdo_dbh.c pdo_stmt.c 
  Log:
  Fixed memory leaks
  
  
http://cvs.php.net/diff.php/php-src/ext/pdo/pdo_dbh.c?r1=1.76&r2=1.77&ty=u
Index: php-src/ext/pdo/pdo_dbh.c
diff -u php-src/ext/pdo/pdo_dbh.c:1.76 php-src/ext/pdo/pdo_dbh.c:1.77
--- php-src/ext/pdo/pdo_dbh.c:1.76      Sat Jun 11 08:36:12 2005
+++ php-src/ext/pdo/pdo_dbh.c   Thu Jul  7 07:19:56 2005
@@ -18,7 +18,7 @@
   +----------------------------------------------------------------------+
 */
 
-/* $Id: pdo_dbh.c,v 1.76 2005/06/11 12:36:12 wez Exp $ */
+/* $Id: pdo_dbh.c,v 1.77 2005/07/07 11:19:56 dmitry Exp $ */
 
 /* The PDO Database Handle Class */
 
@@ -94,6 +94,7 @@
                
                if (info) {
                        zend_update_property(pdo_ex, ex, "errorInfo", 
sizeof("errorInfo")-1, info TSRMLS_CC);
+                       zval_ptr_dtor(&info);
                }
 
                zend_throw_exception_object(ex TSRMLS_CC);
@@ -162,7 +163,7 @@
                if (info) {
                        zval_ptr_dtor(&info);
                }
-       } else {
+       } else if (EG(exception) == NULL) {
                zval *ex;
                zend_class_entry *def_ex = zend_exception_get_default(), 
*pdo_ex = php_pdo_get_exception();
 
@@ -174,6 +175,7 @@
                
                if (info) {
                        zend_update_property(pdo_ex, ex, "errorInfo", 
sizeof("errorInfo")-1, info TSRMLS_CC);
+                       zval_ptr_dtor(&info);
                }
 
                zend_throw_exception_object(ex TSRMLS_CC);
http://cvs.php.net/diff.php/php-src/ext/pdo/pdo_stmt.c?r1=1.101&r2=1.102&ty=u
Index: php-src/ext/pdo/pdo_stmt.c
diff -u php-src/ext/pdo/pdo_stmt.c:1.101 php-src/ext/pdo/pdo_stmt.c:1.102
--- php-src/ext/pdo/pdo_stmt.c:1.101    Sat Jul  2 23:49:44 2005
+++ php-src/ext/pdo/pdo_stmt.c  Thu Jul  7 07:19:56 2005
@@ -18,7 +18,7 @@
   +----------------------------------------------------------------------+
 */
 
-/* $Id: pdo_stmt.c,v 1.101 2005/07/03 03:49:44 wez Exp $ */
+/* $Id: pdo_stmt.c,v 1.102 2005/07/07 11:19:56 dmitry Exp $ */
 
 /* The PDO Statement Handle Class */
 
@@ -690,7 +690,7 @@
                stmt->fetch.cls.ctor_args = NULL;
                stmt->fetch.cls.fci.param_count = 0;
        }
-       if (stmt->fetch.func.values && free_ctor_agrs) {
+       if (stmt->fetch.func.values) {
                FREE_ZVAL(stmt->fetch.func.values);
                stmt->fetch.func.values = NULL;
        }
@@ -897,6 +897,7 @@
                                                zend_update_property(ce, 
return_value,
                                                        stmt->columns[i].name, 
stmt->columns[i].namelen,
                                                        val TSRMLS_CC);
+                                               zval_ptr_dtor(&val);
                                        } else {
 #ifdef MBO_0
                                                php_unserialize_data_t var_hash;
@@ -911,13 +912,17 @@
 #endif
 #if PHP_MAJOR_VERSION > 5 || PHP_MINOR_VERSION >= 1
                                                if (!ce->unserialize) {
+                                                       zval_ptr_dtor(&val);
                                                        
pdo_raise_impl_error(stmt->dbh, stmt, "HY000", "cannot unserialize class" 
TSRMLS_CC);
                                                        return 0;
                                                } else if 
(ce->unserialize(&return_value, ce, Z_TYPE_P(val) == IS_STRING ? 
Z_STRVAL_P(val) : "", Z_TYPE_P(val) == IS_STRING ? Z_STRLEN_P(val) : 0, NULL 
TSRMLS_CC) == FAILURE) {
+                                                       zval_ptr_dtor(&val);
                                                        
pdo_raise_impl_error(stmt->dbh, stmt, "HY000", "cannot unserialize class" 
TSRMLS_CC);
                                                        zval_dtor(return_value);
                                                        ZVAL_NULL(return_value);
                                                        return 0;
+                                               } else {
+                                                       zval_ptr_dtor(&val);
                                                }
 #endif
                                        }
@@ -1902,7 +1907,7 @@
        }
                
        if (I->fetch_ahead) {
-               ZVAL_DELREF(I->fetch_ahead);
+               zval_ptr_dtor(&I->fetch_ahead);
        }
 
        efree(I);
@@ -1918,7 +1923,6 @@
 static void pdo_stmt_iter_get_data(zend_object_iterator *iter, zval ***data 
TSRMLS_DC)
 {
        struct php_pdo_iterator *I = (struct php_pdo_iterator*)iter->data;
-       zval **ptr_ptr;
 
        /* sanity */
        if (!I->fetch_ahead) {
@@ -1926,11 +1930,7 @@
                return;
        }
 
-       ptr_ptr = emalloc(sizeof(*ptr_ptr)); /* leaks somewhere */
-       *ptr_ptr = I->fetch_ahead;
-       ZVAL_ADDREF(I->fetch_ahead);
-       
-       *data = ptr_ptr;
+       *data = &I->fetch_ahead;
 }
 
 static int pdo_stmt_iter_get_key(zend_object_iterator *iter, char **str_key, 
uint *str_key_len,
@@ -1950,7 +1950,7 @@
        struct php_pdo_iterator *I = (struct php_pdo_iterator*)iter->data;
 
        if (I->fetch_ahead) {
-               ZVAL_DELREF(I->fetch_ahead);
+               zval_ptr_dtor(&I->fetch_ahead);
                I->fetch_ahead = NULL;
        }
 

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

Reply via email to