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

Reply via email to