Skip to content

Commit

Permalink
ext/mysqlnd: fixed known issues and added test case
Browse files Browse the repository at this point in the history
  • Loading branch information
Appla committed Mar 8, 2024
1 parent 1c0253d commit 67ef59b
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 11 deletions.
38 changes: 38 additions & 0 deletions ext/mysqli/tests/bug81335.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
--TEST--
Bug #81335: Packets out of order after connection timeout
--EXTENSIONS--
mysqli
--SKIPIF--
<?php
if (getenv("SKIP_SLOW_TESTS")) die("skip slow test");

if (!defined('MYSQLI_STORE_RESULT_COPY_DATA')) die('skip requires mysqlnd');

require_once 'connect.inc';
if (!$link = @my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) die("skip cannot connect");
if (mysqli_get_server_version($link) < 80024) {
$link->close();
die("skip: Due to many MySQL Server differences, the test requires >= 8.0.24");
}
$link->close();
?>
--FILE--
<?php

require_once 'connect.inc';
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new my_mysqli($host, $user, $passwd, $db, $port, $socket);
$mysqli->query('SET WAIT_TIMEOUT=1');
usleep(1000000 * 1.1);
try {
$mysqli->query('SELECT SLEEP(1)');
} catch(mysqli_sql_exception $e) {
echo $e->getMessage();
echo "\n";
echo $e->getCode();
}
$mysqli->close();
?>
--EXPECTF--
The client was disconnected by the server because of inactivity. See wait_timeout and interactive_timeout for configuring this behavior.
4031
2 changes: 1 addition & 1 deletion ext/mysqlnd/mysqlnd_enum_n_def.h
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@
#define CR_INVALID_PARAMETER_NO 2034
#define CR_INVALID_BUFFER_USE 2035
#define CR_LOAD_DATA_LOCAL_INFILE_REJECTED 2068
#define ER_CLIENT_INTERACTION_TIMEOUT 4031
#define CR_CLIENT_INTERACTION_TIMEOUT 4031

#define MYSQLND_EE_FILENOTFOUND 7890

Expand Down
2 changes: 1 addition & 1 deletion ext/mysqlnd/mysqlnd_result.c
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,7 @@ mysqlnd_query_read_result_set_header(MYSQLND_CONN_DATA * conn, MYSQLND_STMT * s)
UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(conn->upsert_status);

if (FAIL == (ret = PACKET_READ(conn, &rset_header))) {
if (conn->error_info->error_no != CR_SERVER_GONE_ERROR && conn->error_info->error_no != ER_CLIENT_INTERACTION_TIMEOUT) {
if (conn->error_info->error_no != CR_SERVER_GONE_ERROR && conn->error_info->error_no != CR_CLIENT_INTERACTION_TIMEOUT) {
php_error_docref(NULL, E_WARNING, "Error reading result set's header");
}
break;
Expand Down
13 changes: 4 additions & 9 deletions ext/mysqlnd/mysqlnd_wireprotocol.c
Original file line number Diff line number Diff line change
Expand Up @@ -269,21 +269,16 @@ mysqlnd_read_header(MYSQLND_PFC * pfc, MYSQLND_VIO * vio, MYSQLND_PACKET_HEADER
}
// @see https://dev.mysql.com/worklog/task/?id=12999
if (header->size > 0) {
DBG_ERR_FMT("Logical link: try reap pending data. Packet size=%zu", header->size);
zend_uchar *buf = emalloc(header->size);
zend_uchar *buf = mnd_emalloc(header->size);
if ((PASS == pfc->data->m.receive(pfc, vio, buf, header->size, conn_stats, error_info)) && buf[0] == ERROR_MARKER) {
php_mysqlnd_read_error_from_line(buf + 1, header->size - 1,
error_info->error, sizeof(error_info->error),
&error_info->error_no, error_info->sqlstate
);
if (error_info->error_no == ER_CLIENT_INTERACTION_TIMEOUT) {
efree(buf);
DBG_RETURN(FAIL);
} else {
error_info->error_no = 0;
}
mnd_efree(buf);
DBG_RETURN(FAIL);
}
efree(buf);
mnd_efree(buf);
}

DBG_ERR_FMT("Logical link: packets out of order. Expected %u received %u. Packet size=%zu",
Expand Down

0 comments on commit 67ef59b

Please sign in to comment.