Exercise invalid UDP INIT path identifiers and MTU limits
This commit is contained in:
1 parent
52d9077bb5
commit
1260884485
1 file changed
+12
-3
@@ -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);
|
||||
|
||||
Reference in new issue
Block a user