andrey                                   Wed, 24 Mar 2010 15:17:57 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=296724

Log:
Fix a segfault when using a mysqli object after unsuccesssful connect, the
handle should have been allocated with mysqli_init().

Changed paths:
    U   php/php-src/branches/PHP_5_3/ext/mysqli/mysqli_nonapi.c
    U   php/php-src/trunk/ext/mysqli/mysqli_nonapi.c
    U   php/php-src/trunk/ext/mysqlnd/mysqlnd_wireprotocol.h

Modified: php/php-src/branches/PHP_5_3/ext/mysqli/mysqli_nonapi.c
===================================================================
--- php/php-src/branches/PHP_5_3/ext/mysqli/mysqli_nonapi.c     2010-03-24 
15:04:56 UTC (rev 296723)
+++ php/php-src/branches/PHP_5_3/ext/mysqli/mysqli_nonapi.c     2010-03-24 
15:17:57 UTC (rev 296724)
@@ -69,6 +69,7 @@
        zend_bool                       new_connection = FALSE;
        zend_rsrc_list_entry    *le;
        mysqli_plist_entry *plist = NULL;
+       zend_bool                       self_alloced = 0;


 #if !defined(MYSQL_USE_MYSQLND)
@@ -99,6 +100,7 @@
                }
                if (!mysql) {
                        mysql = (MY_MYSQL *) ecalloc(1, sizeof(MY_MYSQL));
+                       self_alloced = 1;
                }
                flags |= CLIENT_MULTI_RESULTS; /* needed for 
mysql_multi_query() */
        } else {
@@ -243,6 +245,7 @@
                if (!is_real_connect) {
                        /* free mysql structure */
                        mysqli_close(mysql->mysql, MYSQLI_CLOSE_DISCONNECTED);
+                       mysql->mysql = NULL;
                }
                goto err;
        }
@@ -292,7 +295,7 @@
                mysql->hash_key = NULL;
                mysql->persistent = FALSE;
        }
-       if (!is_real_connect) {
+       if (!is_real_connect && self_alloced) {
                efree(mysql);
        }
        RETVAL_FALSE;

Modified: php/php-src/trunk/ext/mysqli/mysqli_nonapi.c
===================================================================
--- php/php-src/trunk/ext/mysqli/mysqli_nonapi.c        2010-03-24 15:04:56 UTC 
(rev 296723)
+++ php/php-src/trunk/ext/mysqli/mysqli_nonapi.c        2010-03-24 15:17:57 UTC 
(rev 296724)
@@ -69,6 +69,7 @@
        zend_bool                       new_connection = FALSE;
        zend_rsrc_list_entry    *le;
        mysqli_plist_entry *plist = NULL;
+       zend_bool                       self_alloced = 0;


 #if !defined(MYSQL_USE_MYSQLND)
@@ -99,6 +100,7 @@
                }
                if (!mysql) {
                        mysql = (MY_MYSQL *) ecalloc(1, sizeof(MY_MYSQL));
+                       self_alloced = 1;
                }
                flags |= CLIENT_MULTI_RESULTS; /* needed for 
mysql_multi_query() */
        } else {
@@ -243,6 +245,7 @@
                if (!is_real_connect) {
                        /* free mysql structure */
                        mysqli_close(mysql->mysql, MYSQLI_CLOSE_DISCONNECTED);
+                       mysql->mysql = NULL;
                }
                goto err;
        }
@@ -292,7 +295,7 @@
                mysql->hash_key = NULL;
                mysql->persistent = FALSE;
        }
-       if (!is_real_connect) {
+       if (!is_real_connect && self_alloced) {
                efree(mysql);
        }
        RETVAL_FALSE;

Modified: php/php-src/trunk/ext/mysqlnd/mysqlnd_wireprotocol.h
===================================================================
--- php/php-src/trunk/ext/mysqlnd/mysqlnd_wireprotocol.h        2010-03-24 
15:04:56 UTC (rev 296723)
+++ php/php-src/trunk/ext/mysqlnd/mysqlnd_wireprotocol.h        2010-03-24 
15:17:57 UTC (rev 296724)
@@ -268,7 +268,7 @@


 PHPAPI MYSQLND_PROTOCOL * mysqlnd_protocol_init(zend_bool persistent 
TSRMLS_DC);
-PHPAPI void mysqlnd_protocol_free(MYSQLND_PROTOCOL * const protocol TSRMLS_DC)
+PHPAPI void mysqlnd_protocol_free(MYSQLND_PROTOCOL * const protocol TSRMLS_DC);


 #endif /* MYSQLND_WIREPROTOCOL_H */

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

Reply via email to