]> granicus.if.org Git - php/commitdiff
fixed memleak in mysqli_close
authorGeorg Richter <georg@php.net>
Thu, 5 May 2005 13:02:32 +0000 (13:02 +0000)
committerGeorg Richter <georg@php.net>
Thu, 5 May 2005 13:02:32 +0000 (13:02 +0000)
fixed bug #32956 (mysqli_bind_result doesn't support MYSQL_TYPE_NULL)

ext/mysqli/mysqli.c
ext/mysqli/mysqli_api.c
ext/mysqli/tests/064.phpt [new file with mode: 0644]

index 5bcb3421f05a0b6516b7cc35030f831f342f5f13..6dede24aa498a3d42778cd1e4518d6d1b8656fd4 100644 (file)
@@ -69,7 +69,7 @@ void php_free_stmt_bind_buffer(BIND_BUFFER bbuf, int type)
        for (i=0; i < bbuf.var_cnt; i++) {
 
                /* free temporary bind buffer */
-               if (type == FETCH_RESULT) {
+               if (type == FETCH_RESULT && bbuf.buf[i].val) {
                        efree(bbuf.buf[i].val);
                }
 
@@ -133,9 +133,14 @@ static void mysqli_objects_free_storage(zend_object *object TSRMLS_DC)
                if (my_res && my_res->ptr) {
                        MY_MYSQL *mysql = (MY_MYSQL *)my_res->ptr;
                
-                       mysql_close(mysql->mysql);
+                       if (mysql->mysql) {
+                               mysql_close(mysql->mysql);
+                       }
+
+                       php_clear_mysql(mysql);
+                       efree(mysql);
 
-                       php_clear_mysql(mysql);         
+                       my_res->ptr = NULL;
                }
        } else if (intern->zo.ce == mysqli_stmt_class_entry) { /* stmt object */
                if (my_res && my_res->ptr) {
index 12d3a1636327a3bb5918b87b75b759e31fbef7ba..6d291498b47bb92e5ec94f38b88ebd5af4a4049a 100644 (file)
@@ -277,6 +277,15 @@ PHP_FUNCTION(mysqli_stmt_bind_result)
                                bind[ofs].is_null = &stmt->result.is_null[ofs];
                                break;
 
+                       case MYSQL_TYPE_NULL:
+                               stmt->result.buf[ofs].type = IS_NULL; 
+                               stmt->result.buf[ofs].buflen = 0;
+                               bind[ofs].buffer_type = MYSQL_TYPE_NULL;
+                               bind[ofs].buffer = 0;
+                               bind[ofs].is_null = &stmt->result.is_null[ofs];
+                               bind[ofs].buffer_length = 0;
+                       break;
+
                        case MYSQL_TYPE_SHORT:
                        case MYSQL_TYPE_TINY:
                        case MYSQL_TYPE_LONG:
@@ -423,7 +432,8 @@ PHP_FUNCTION(mysqli_close)
        MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link, "mysqli_link");
 
        mysql_close(mysql->mysql);
-       php_clear_mysql(mysql); 
+       php_clear_mysql(mysql);
+       efree(mysql);
        MYSQLI_CLEAR_RESOURCE(&mysql_link);     
        RETURN_TRUE;
 }
@@ -1013,7 +1023,7 @@ PHP_FUNCTION(mysqli_info)
 PHP_FUNCTION(mysqli_init)
 {
        MYSQLI_RESOURCE *mysqli_resource;
-       MY_MYSQL *mysql = (MY_MYSQL *)calloc(1, sizeof(MY_MYSQL));
+       MY_MYSQL *mysql = (MY_MYSQL *)ecalloc(1, sizeof(MY_MYSQL));
 
        if (!(mysql->mysql = mysql_init(NULL))) {
                efree(mysql);
diff --git a/ext/mysqli/tests/064.phpt b/ext/mysqli/tests/064.phpt
new file mode 100644 (file)
index 0000000..e6df1e4
--- /dev/null
@@ -0,0 +1,21 @@
+--TEST--
+NULL binding 
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+       include "connect.inc";
+
+       $mysql = new mysqli($host, $user, $passwd);
+
+       $stmt = new mysqli_stmt($mysql, "SELECT NULL FROM DUAL");
+       $stmt->execute();
+       $stmt->bind_result($foo);
+       $stmt->fetch();
+       $stmt->close();
+       $mysql->close();
+
+       var_dump($foo);
+?>
+--EXPECT--
+NULL