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