andrey Thu, 17 Mar 2011 10:28:53 +0000 Revision: http://svn.php.net/viewvc?view=revision&revision=309339
Log: Fix for bug #54221 mysqli::get_warnings segfault when used in multi queries Bug: http://bugs.php.net/54221 (Assigned) mysqli::get_warnings segfault when used in multi queries Changed paths: U php/php-src/branches/PHP_5_3/ext/mysqli/mysqli_warning.c A php/php-src/branches/PHP_5_3/ext/mysqli/tests/bug54221.phpt U php/php-src/trunk/ext/mysqli/mysqli_warning.c A php/php-src/trunk/ext/mysqli/tests/bug54221.phpt Modified: php/php-src/branches/PHP_5_3/ext/mysqli/mysqli_warning.c =================================================================== --- php/php-src/branches/PHP_5_3/ext/mysqli/mysqli_warning.c 2011-03-17 10:13:20 UTC (rev 309338) +++ php/php-src/branches/PHP_5_3/ext/mysqli/mysqli_warning.c 2011-03-17 10:28:53 UTC (rev 309339) @@ -197,7 +197,7 @@ MYSQLI_FETCH_RESOURCE(w, MYSQLI_WARNING *, &mysqli_warning, "mysqli_warning", MYSQLI_STATUS_VALID); - if (w->next) { + if (w && w->next) { w = w->next; ((MYSQLI_RESOURCE *)(obj->ptr))->ptr = w; RETURN_TRUE; Added: php/php-src/branches/PHP_5_3/ext/mysqli/tests/bug54221.phpt =================================================================== --- php/php-src/branches/PHP_5_3/ext/mysqli/tests/bug54221.phpt (rev 0) +++ php/php-src/branches/PHP_5_3/ext/mysqli/tests/bug54221.phpt 2011-03-17 10:28:53 UTC (rev 309339) @@ -0,0 +1,47 @@ +--TEST-- +Bug #54221 mysqli::get_warnings segfault when used in multi queries +--SKIPIF-- +<?php +require_once('skipif.inc'); +require_once('skipifconnectfailure.inc'); +?> +--INI-- +mysqli.max_links = 1 +mysqli.allow_persistent = Off +mysqli.max_persistent = 0 +mysqli.reconnect = Off +--FILE-- +<?php + include ("connect.inc"); + + $link = mysqli_init(); + if (!my_mysqli_real_connect($link, $host, $user, $passwd, $db, $port, $socket)) { + printf("[002] Connect failed, [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); + } + + $create = "CREATE TEMPORARY TABLE IF NOT EXISTS t54221(a int)"; + + $query = "$create;$create;$create;"; + if ($link->multi_query($query)) { + do { + $sth = $link->store_result(); + + if ($link->warning_count) { + $warnings = $link->get_warnings(); + if ($warnings) { + do { + echo "Warning: ".$warnings->errno.": ".$warnings->message."\n"; + } while ($warnings->next()); + } + } + } while ($link->more_results() && $link->next_result()); + } + + mysqli_close($link); + + print "done!"; +?> +--EXPECTF-- +Warning: : +Warning: 1050: Table 't54221' already exists +done! Modified: php/php-src/trunk/ext/mysqli/mysqli_warning.c =================================================================== --- php/php-src/trunk/ext/mysqli/mysqli_warning.c 2011-03-17 10:13:20 UTC (rev 309338) +++ php/php-src/trunk/ext/mysqli/mysqli_warning.c 2011-03-17 10:28:53 UTC (rev 309339) @@ -197,7 +197,7 @@ MYSQLI_FETCH_RESOURCE(w, MYSQLI_WARNING *, &mysqli_warning, "mysqli_warning", MYSQLI_STATUS_VALID); - if (w->next) { + if (w && w->next) { w = w->next; ((MYSQLI_RESOURCE *)(obj->ptr))->ptr = w; RETURN_TRUE; Added: php/php-src/trunk/ext/mysqli/tests/bug54221.phpt =================================================================== --- php/php-src/trunk/ext/mysqli/tests/bug54221.phpt (rev 0) +++ php/php-src/trunk/ext/mysqli/tests/bug54221.phpt 2011-03-17 10:28:53 UTC (rev 309339) @@ -0,0 +1,47 @@ +--TEST-- +Bug #54221 mysqli::get_warnings segfault when used in multi queries +--SKIPIF-- +<?php +require_once('skipif.inc'); +require_once('skipifconnectfailure.inc'); +?> +--INI-- +mysqli.max_links = 1 +mysqli.allow_persistent = Off +mysqli.max_persistent = 0 +mysqli.reconnect = Off +--FILE-- +<?php + include ("connect.inc"); + + $link = mysqli_init(); + if (!my_mysqli_real_connect($link, $host, $user, $passwd, $db, $port, $socket)) { + printf("[002] Connect failed, [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); + } + + $create = "CREATE TEMPORARY TABLE IF NOT EXISTS t54221(a int)"; + + $query = "$create;$create;$create;"; + if ($link->multi_query($query)) { + do { + $sth = $link->store_result(); + + if ($link->warning_count) { + $warnings = $link->get_warnings(); + if ($warnings) { + do { + echo "Warning: ".$warnings->errno.": ".$warnings->message."\n"; + } while ($warnings->next()); + } + } + } while ($link->more_results() && $link->next_result()); + } + + mysqli_close($link); + + print "done!"; +?> +--EXPECTF-- +Warning: : +Warning: 1050: Table 't54221' already exists +done!
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php