Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/actions/test-linux/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,11 @@ runs:
export SKIP_IO_CAPTURE_TESTS=1
export TEST_PHP_JUNIT=junit.out.xml
export STACK_LIMIT_DEFAULTS_CHECK=1
sapi/cli/php run-tests.php -P -q ${{ inputs.runTestsParameters }} \
sapi/cli/php run-tests.php ext/mysqli/tests -P -q ${{ inputs.runTestsParameters }} \
-d opcache.jit=${{ inputs.jitType }} \
-d opcache.protect_memory=1 \
-d opcache.jit_buffer_size=64M \
${{ inputs.idleCpu == 'true' && '-j$(($(/usr/bin/nproc) - 1))' || '-j$(/usr/bin/nproc)' }} \
${{ inputs.idleCpu == 'true' && '-j1)' || '-j1' }} \
-g FAIL,BORK,LEAK,XLEAK \
--no-progress \
--offline \
Expand Down
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
1 change: 1 addition & 0 deletions ext/mysqlnd/mysqlnd_enum_n_def.h
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@
#define CR_INVALID_PARAMETER_NO 2034
#define CR_INVALID_BUFFER_USE 2035
#define CR_LOAD_DATA_LOCAL_INFILE_REJECTED 2068
#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) {
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
18 changes: 17 additions & 1 deletion ext/mysqlnd/mysqlnd_wireprotocol.c
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,19 @@ mysqlnd_read_header(MYSQLND_PFC * pfc, MYSQLND_VIO * vio, MYSQLND_PACKET_HEADER
pfc->data->packet_no++;
DBG_RETURN(PASS);
}
// @see https://dev.mysql.com/worklog/task/?id=12999
if (header->size > 0) {
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
);
mnd_efree(buf);
DBG_RETURN(FAIL);
}
mnd_efree(buf);
}

DBG_ERR_FMT("Logical link: packets out of order. Expected %u received %u. Packet size=%zu",
pfc->data->packet_no, header->packet_no, header->size);
Expand All @@ -292,9 +305,12 @@ mysqlnd_read_packet_header_and_body(MYSQLND_PACKET_HEADER * packet_header,
{
DBG_ENTER("mysqlnd_read_packet_header_and_body");
DBG_INF_FMT("buf=%p size=%zu", buf, buf_size);
assert(error_info->error_no == 0);
if (FAIL == mysqlnd_read_header(pfc, vio, packet_header, stats, error_info)) {
SET_CONNECTION_STATE(connection_state, CONN_QUIT_SENT);
SET_CLIENT_ERROR(error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone);
if (error_info->error_no == 0) {
SET_CLIENT_ERROR(error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone);
}
DBG_ERR_FMT("Can't read %s's header", packet_type_as_text);
DBG_RETURN(FAIL);
}
Expand Down