summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/mysqli/mysqli_warning.c2
-rw-r--r--ext/mysqli/tests/bug54221.phpt47
2 files changed, 48 insertions, 1 deletions
diff --git a/ext/mysqli/mysqli_warning.c b/ext/mysqli/mysqli_warning.c
index 09fa5b3510..ee815121b3 100644
--- a/ext/mysqli/mysqli_warning.c
+++ b/ext/mysqli/mysqli_warning.c
@@ -197,7 +197,7 @@ PHP_METHOD(mysqli_warning, next)
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;
diff --git a/ext/mysqli/tests/bug54221.phpt b/ext/mysqli/tests/bug54221.phpt
new file mode 100644
index 0000000000..78c9a2c40e
--- /dev/null
+++ b/ext/mysqli/tests/bug54221.phpt
@@ -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!