From f31396a3fcc9f63630716b662d7cfd89d1d053b9 Mon Sep 17 00:00:00 2001 From: lazerg Date: Fri, 23 Oct 2026 22:52:04 +0500 Subject: [PATCH 1/2] Fix GH-24609: mysqlnd OK packets without info rejected on x32 builds --- NEWS | 2 ++ ext/mysqli/tests/fake_server.inc | 20 ++++++++++++++++++ ext/mysqli/tests/gh24609.phpt | 34 ++++++++++++++++++++++++++++++ ext/mysqlnd/mysqlnd_wireprotocol.c | 2 +- 4 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 ext/mysqli/tests/gh24609.phpt diff --git a/NEWS b/NEWS index cb68d41c3332..4f7a144ca296 100644 --- a/NEWS +++ b/NEWS @@ -65,6 +65,8 @@ PHP NEWS - MySQLnd: . Fixed bug GH-24293 (Segfault on connect with an empty password to a MariaDB PAM account). (lazerg) + . Fixed bug GH-24609 (OK packets without an info message rejected on x32 + builds). (lazerg) - Opcache: . Fixed tracing JIT returning a wrapped integer instead of a float on diff --git a/ext/mysqli/tests/fake_server.inc b/ext/mysqli/tests/fake_server.inc index 2a4d17f946e8..9dfe4b0d4b3a 100644 --- a/ext/mysqli/tests/fake_server.inc +++ b/ext/mysqli/tests/fake_server.inc @@ -1021,6 +1021,26 @@ function my_mysqli_test_upsert_rset_header_packet_len_over_read(my_mysqli_fake_s } +function my_mysqli_test_upsert_rset_header_no_info(my_mysqli_fake_server_conn $conn): void +{ + $ur = $conn->packet_generator->server_upsert_result_response(); + + $ur->packet_length = "070000"; + $ur->affected_rows = "00"; + $ur->last_insert_id = "00"; + $ur->server_status = "0200"; + $ur->warning_count = "0000"; + $ur->payload = ""; + + $conn->send_server_greetings(); + $conn->read(); + $conn->send_server_ok(); + $conn->read(); + $conn->send($ur->to_bytes(), "Upsert Response without info"); + $conn->read(65536); +} + + function my_mysqli_test_query_response_row_read_two_fields(my_mysqli_fake_server_conn $conn): void { $conn->send_server_greetings(); diff --git a/ext/mysqli/tests/gh24609.phpt b/ext/mysqli/tests/gh24609.phpt new file mode 100644 index 000000000000..127d9f1325c1 --- /dev/null +++ b/ext/mysqli/tests/gh24609.phpt @@ -0,0 +1,34 @@ +--TEST-- +GH-24609 (mysqlnd: OK packet without an info message rejected on x32 builds) +--EXTENSIONS-- +mysqli +--FILE-- +wait(); + +mysqli_report(MYSQLI_REPORT_OFF); +$conn = new mysqli("127.0.0.1", "root", "", "", $process->getPort()); +var_dump($conn->query("SET NAMES utf8")); +var_dump($conn->affected_rows); +$conn->close(); + +$process->terminate(true); + +print "done!"; +?> +--EXPECTF-- +[*] Server started on 127.0.0.1:%d +[*] Connection established +[*] Sending - Server Greeting: %s +[*] Received: %s +[*] Sending - Server OK: %s +[*] Received: %s +[*] Sending - Upsert Response without info: %s +bool(true) +int(0) +[*] Received: 0100000001 +[*] Server finished +done! diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index 495539d970df..740d13031e88 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -1129,7 +1129,7 @@ php_mysqlnd_rset_header_read(MYSQLND_CONN_DATA * conn, void * _packet) zend_uchar * const buf = (zend_uchar *) pfc->cmd_buffer.buffer; const zend_uchar * p = buf; const zend_uchar * const begin = buf; - size_t len; + zend_ulong len; MYSQLND_OPTIONAL_UINT64_T len_ll; DBG_ENTER("php_mysqlnd_rset_header_read"); From af2e9cf5f12c38252dd45198a15cb6f5b13c8a53 Mon Sep 17 00:00:00 2001 From: lazerg Date: Sat, 24 Oct 2026 00:04:33 +0500 Subject: [PATCH 2/2] Drop test for GH-24609 --- ext/mysqli/tests/fake_server.inc | 20 ------------------- ext/mysqli/tests/gh24609.phpt | 34 -------------------------------- 2 files changed, 54 deletions(-) delete mode 100644 ext/mysqli/tests/gh24609.phpt diff --git a/ext/mysqli/tests/fake_server.inc b/ext/mysqli/tests/fake_server.inc index 9dfe4b0d4b3a..2a4d17f946e8 100644 --- a/ext/mysqli/tests/fake_server.inc +++ b/ext/mysqli/tests/fake_server.inc @@ -1021,26 +1021,6 @@ function my_mysqli_test_upsert_rset_header_packet_len_over_read(my_mysqli_fake_s } -function my_mysqli_test_upsert_rset_header_no_info(my_mysqli_fake_server_conn $conn): void -{ - $ur = $conn->packet_generator->server_upsert_result_response(); - - $ur->packet_length = "070000"; - $ur->affected_rows = "00"; - $ur->last_insert_id = "00"; - $ur->server_status = "0200"; - $ur->warning_count = "0000"; - $ur->payload = ""; - - $conn->send_server_greetings(); - $conn->read(); - $conn->send_server_ok(); - $conn->read(); - $conn->send($ur->to_bytes(), "Upsert Response without info"); - $conn->read(65536); -} - - function my_mysqli_test_query_response_row_read_two_fields(my_mysqli_fake_server_conn $conn): void { $conn->send_server_greetings(); diff --git a/ext/mysqli/tests/gh24609.phpt b/ext/mysqli/tests/gh24609.phpt deleted file mode 100644 index 127d9f1325c1..000000000000 --- a/ext/mysqli/tests/gh24609.phpt +++ /dev/null @@ -1,34 +0,0 @@ ---TEST-- -GH-24609 (mysqlnd: OK packet without an info message rejected on x32 builds) ---EXTENSIONS-- -mysqli ---FILE-- -wait(); - -mysqli_report(MYSQLI_REPORT_OFF); -$conn = new mysqli("127.0.0.1", "root", "", "", $process->getPort()); -var_dump($conn->query("SET NAMES utf8")); -var_dump($conn->affected_rows); -$conn->close(); - -$process->terminate(true); - -print "done!"; -?> ---EXPECTF-- -[*] Server started on 127.0.0.1:%d -[*] Connection established -[*] Sending - Server Greeting: %s -[*] Received: %s -[*] Sending - Server OK: %s -[*] Received: %s -[*] Sending - Upsert Response without info: %s -bool(true) -int(0) -[*] Received: 0100000001 -[*] Server finished -done!