]> granicus.if.org Git - php/commitdiff
fixed some leaks when mysql_close will be called before all stmts are freed.
authorGeorg Richter <georg@php.net>
Tue, 18 Feb 2003 00:00:51 +0000 (00:00 +0000)
committerGeorg Richter <georg@php.net>
Tue, 18 Feb 2003 00:00:51 +0000 (00:00 +0000)
ext/mysqli/mysqli.c
ext/mysqli/mysqli_api.c

index a72494ff5a85a3e990ac5579ddee5ef8bd2f43b6..75996eab4d461b99e55c0762428a6d60fe802efe 100644 (file)
@@ -43,9 +43,11 @@ void php_clear_stmt_bind(STMT *stmt)
 {
        unsigned int i;
 
-       if (stmt->stmt && stmt->stmt->mysql->host) {
-               mysql_stmt_close(stmt->stmt);
-       }
+       /* 
+        * we don't need to call mysql_stmt_close here.
+        * in case mysqli_stmt_close wasn't called, all
+        * statements will be freed via mysql_close
+        */
 
        if (stmt->var_cnt) {
                for (i = 0; i < stmt->var_cnt; i++) {
@@ -79,6 +81,13 @@ static void mysqli_objects_dtor(void *object, zend_object_handle handle TSRMLS_D
        if (intern->zo.ce == mysqli_link_class_entry) {
                MYSQL   *mysql = (MYSQL *)intern->ptr;
                if (mysql) {
+                       /*
+                        * Don't free mysql if there exist
+                        * non closed statements
+                        */
+                       if (mysql->stmts) {
+                               mysql->free_me = 0;
+                       }
                        mysql_close(mysql);
                }
        } else if (intern->zo.ce == mysqli_stmt_class_entry) { /* stmt object */
@@ -92,7 +101,6 @@ static void mysqli_objects_dtor(void *object, zend_object_handle handle TSRMLS_D
                        mysql_free_result(res);
                }
        }
-
        zend_objects_destroy_object(object, handle TSRMLS_CC);
 }
 /* }}} */
index e37a120a00f3c1074df60edecd05ad33d75498a8..070f629b6a6b34ac82ffe8b2c41beb997a7fe697 100644 (file)
@@ -384,6 +384,15 @@ PHP_FUNCTION(mysqli_close)
        }
 
        MYSQLI_FETCH_RESOURCE(mysql, MYSQL *, &mysql_link, "mysqli_link"); 
+
+       /*
+        * Don't free initial struct if there exist 
+        * non closed statements
+        */
+       if (mysql->stmts) {
+               mysql->free_me = 0;
+       }
+
        mysql_close(mysql);
        MYSQLI_CLEAR_RESOURCE(&mysql_link);     
        RETURN_TRUE;
@@ -1519,7 +1528,7 @@ PHP_FUNCTION(mysqli_stmt_close)
                return;
        }
        MYSQLI_FETCH_RESOURCE(stmt, STMT *, &mysql_stmt, "mysqli_stmt"); 
-
+       mysql_stmt_close(stmt->stmt);
        php_clear_stmt_bind(stmt); 
        MYSQLI_CLEAR_RESOURCE(&mysql_stmt);
        RETURN_TRUE;