From 12608844857f3973eac3d0152f3e4ba2265c1c49 Mon Sep 17 00:00:00 2001 From: evgeny Date: Fri, 23 Oct 2026 23:40:37 +0200 Subject: [PATCH] Exercise invalid UDP INIT path identifiers and MTU limits --- tests/test_etcp_init_liveness.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/tests/test_etcp_init_liveness.c b/tests/test_etcp_init_liveness.c index 9c28544a..16e493de 100644 --- a/tests/test_etcp_init_liveness.c +++ b/tests/test_etcp_init_liveness.c @@ -250,15 +250,24 @@ static void request_boundaries(unsigned established) { unsigned rejected = 0, accepted = 0; for (unsigned variant = 0; variant < 2; variant++) { request.code = variant ? ETCP_INIT_REQUEST_NOINIT : ETCP_INIT_REQUEST; - for (unsigned invalid = 0; invalid < sizeof(request) + sizeof(request.node_id); invalid++) { + for (unsigned invalid = 0; invalid < sizeof(request) + sizeof(request.node_id) + 5; invalid++) { unsigned length = invalid < sizeof(request) ? invalid : sizeof(request); - if (invalid >= sizeof(request)) request.node_id[invalid - sizeof(request)] ^= 1; + unsigned fault = invalid - sizeof(request); + uint8_t saved_mtu[2]; memcpy(saved_mtu, request.mtu, 2); + uint8_t saved_id = request.link_id; + if (invalid >= sizeof(request) && fault < 8) request.node_id[fault] ^= 1; + if (invalid >= sizeof(request) && fault >= 8 && fault < 12) { + const uint16_t values[] = {0, 1, 100, WIRE_OVERHEAD(AF_INET) + ETCP_PAYLOAD_HEADER_SIZE + ACK_REZERV + 2}; + request.mtu[0] = values[fault - 8] >> 8; request.mtu[1] = values[fault - 8]; + } + if (invalid >= sizeof(request) && fault == 12) request.link_id = 0; struct ETCP_CONN before_conn; struct ETCP_LINK before_link; if (established) { memcpy(&before_conn, ep[1].conn, sizeof(before_conn)); memcpy(&before_link, first_link(1), sizeof(before_link)); } int connections = ep[1].inst->connections->count, pool_free = ep[1].inst->pkt_pool->free_count; size_t errors = ep[1].socket->pkt_format_errors; send_init_request_body(&request, length, 0); - if (invalid >= sizeof(request)) request.node_id[invalid - sizeof(request)] ^= 1; + if (invalid >= sizeof(request) && fault < 8) request.node_id[fault] ^= 1; + memcpy(request.mtu, saved_mtu, 2); request.link_id = saved_id; DEBUG_DEBUG(DEBUG_CATEGORY_DEBUG, "INIT_REQUEST boundary: established=%u code=%u body=%u errors=%zu->%zu", established, request.code, length, errors, ep[1].socket->pkt_format_errors); CHECK(ep[1].socket->pkt_format_errors == errors + 1 && ep[1].socket->errorcode != 0);