Skip to content

Commit 5bf5021

Browse files
committed
Merge branch 'PHP-8.4' into PHP-8.5
* PHP-8.4: Revert the mysqlnd wireprotocol length-encoded bounds checks
2 parents 38a666f + e318023 commit 5bf5021

5 files changed

Lines changed: 2 additions & 193 deletions

File tree

‎ext/mysqli/tests/fake_server.inc‎

Lines changed: 0 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -721,19 +721,6 @@ function my_mysqli_test_auth_response_message_over_read(my_mysqli_fake_server_co
721721
$conn->read();
722722
}
723723

724-
function my_mysqli_test_ok_packet_message_over_read(my_mysqli_fake_server_conn $conn): void
725-
{
726-
$p = new my_mysqli_fake_packet();
727-
$p->full = "08000001" . "00" . "00" . "00" . "0200" . "0000" . "fa";
728-
729-
$conn->send_server_greetings();
730-
$conn->read_packets(1);
731-
$conn->send_server_ok();
732-
$conn->read_packets(1);
733-
$conn->send($p->to_bytes(), "Malicious OK Packet [message length past the packet size]");
734-
$conn->read();
735-
}
736-
737724
function my_mysqli_test_stmt_response_row_over_read_string(my_mysqli_fake_server_conn $conn): void
738725
{
739726
$rh = $conn->packet_generator->server_stmt_execute_items_response();
@@ -829,50 +816,6 @@ function my_mysqli_test_stmt_response_row_read_two_fields(my_mysqli_fake_server_
829816
}
830817
}
831818

832-
function my_mysqli_test_rset_field_metadata_len_over_read(my_mysqli_fake_server_conn $conn): void
833-
{
834-
$rh = $conn->packet_generator->server_tabular_query_response();
835-
836-
$qr2 = new my_mysqli_fake_packet();
837-
$qr2->packet_length = "0c0000";
838-
$qr2->packet_number = "02";
839-
$qr2->catalog_length_plus_name = "0161";
840-
$qr2->db_length_plus_name = "0162";
841-
$qr2->table_length_plus_name = "0163";
842-
$qr2->original_t = "0164";
843-
$qr2->name_length_plus_name = "0165";
844-
$qr2->original_n = "fcff";
845-
846-
$conn->send_server_greetings();
847-
$conn->read_packets(1);
848-
$conn->send_server_ok();
849-
$conn->read_packets(1);
850-
$conn->send($conn->packets_to_bytes([$rh[0], $qr2]), "Malicious Tabular Response [metadata string length past the packet size]");
851-
$conn->read();
852-
}
853-
854-
function my_mysqli_test_rset_field_metadata_len_past_packet(my_mysqli_fake_server_conn $conn): void
855-
{
856-
$rh = $conn->packet_generator->server_tabular_query_response();
857-
858-
$qr2 = new my_mysqli_fake_packet();
859-
$qr2->packet_length = "0c0000";
860-
$qr2->packet_number = "02";
861-
$qr2->catalog_length_plus_name = "0161";
862-
$qr2->db_length_plus_name = "0162";
863-
$qr2->table_length_plus_name = "0163";
864-
$qr2->original_t = "0164";
865-
$qr2->name_length_plus_name = "0165";
866-
$qr2->original_n = "0561";
867-
868-
$conn->send_server_greetings();
869-
$conn->read_packets(1);
870-
$conn->send_server_ok();
871-
$conn->read_packets(1);
872-
$conn->send($conn->packets_to_bytes([$rh[0], $qr2]), "Malicious Tabular Response [metadata string length past the packet size]");
873-
$conn->read();
874-
}
875-
876819
function my_mysqli_test_query_response_row_length_overflow(my_mysqli_fake_server_conn $conn): void
877820
{
878821
$rh = $conn->packet_generator->server_query_execute_data_response('strval');

‎ext/mysqli/tests/mysqlnd_ok_packet_message_over_read.phpt‎

Lines changed: 0 additions & 40 deletions
This file was deleted.

‎ext/mysqli/tests/mysqlnd_rset_field_len_over_read.phpt‎

Lines changed: 0 additions & 42 deletions
This file was deleted.

‎ext/mysqli/tests/mysqlnd_rset_field_len_past_packet.phpt‎

Lines changed: 0 additions & 40 deletions
This file was deleted.

‎ext/mysqlnd/mysqlnd_wireprotocol.c‎

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -878,12 +878,7 @@ php_mysqlnd_ok_read(MYSQLND_CONN_DATA * conn, void * _packet)
878878

879879
/* There is a message */
880880
if (packet->header.size > (size_t) (p - buf) && (net_len = php_mysqlnd_net_field_length(&p))) {
881-
if ((p - buf) > packet->header.size || packet->header.size - (p - buf) < net_len) {
882-
DBG_ERR_FMT("OK packet message length is past the packet size");
883-
php_error_docref(NULL, E_WARNING, "OK packet message length is past the packet size");
884-
DBG_RETURN(FAIL);
885-
}
886-
packet->message_len = net_len;
881+
packet->message_len = MIN(net_len, buf_len - (p - begin));
887882
packet->message = mnd_pestrndup((char *)p, packet->message_len, FALSE);
888883
} else {
889884
packet->message = NULL;
@@ -1176,17 +1171,10 @@ void php_mysqlnd_rset_header_free_mem(void * _packet)
11761171
/* }}} */
11771172

11781173
#define READ_RSET_FIELD(field_name) do { \
1179-
BAIL_IF_NO_MORE_DATA; \
11801174
len = php_mysqlnd_net_field_length(&p); \
11811175
if (UNEXPECTED(len == MYSQLND_NULL_LENGTH)) { \
11821176
goto faulty_or_fake; \
11831177
} else if (len != 0) { \
1184-
BAIL_IF_NO_MORE_DATA; \
1185-
if (UNEXPECTED((p - begin) > packet->header.size || packet->header.size - (p - begin) < len)) { \
1186-
DBG_ERR_FMT("Result set field metadata string length is past the packet size"); \
1187-
php_error_docref(NULL, E_WARNING, "Result set field metadata string length is past the packet size"); \
1188-
DBG_RETURN(FAIL); \
1189-
} \
11901178
meta->field_name = (const char *)p; \
11911179
meta->field_name ## _length = len; \
11921180
p += len; \
@@ -1255,7 +1243,7 @@ php_mysqlnd_rset_field_read(MYSQLND_CONN_DATA * conn, void * _packet)
12551243
READ_RSET_FIELD(name);
12561244
READ_RSET_FIELD(org_name);
12571245

1258-
BAIL_IF_NO_MORE_DATA;
1246+
/* 1 byte length */
12591247
if (UNEXPECTED(12 != *p)) {
12601248
DBG_ERR_FMT("Protocol error. Server sent false length. Expected 12 got %d", (int) *p);
12611249
php_error_docref(NULL, E_WARNING, "Protocol error. Server sent false length. Expected 12");

0 commit comments

Comments
 (0)