@@ -1109,6 +1109,50 @@ START_TEST(test_raw_socket_recv_too_short_drop_returns_einval)
11091109}
11101110END_TEST
11111111
1112+ START_TEST(test_raw_socket_recv_uses_ip_total_length)
1113+ {
1114+ struct wolfIP s;
1115+ int sd;
1116+ uint8_t frame_buf[ETH_HEADER_LEN + IP_HEADER_LEN + 6];
1117+ struct wolfIP_ip_packet *frame = (struct wolfIP_ip_packet *)frame_buf;
1118+ uint8_t payload[2] = {0xAB, 0xCD};
1119+ uint8_t padding[4] = {0x99, 0x98, 0x97, 0x96};
1120+ uint8_t rxbuf[64];
1121+ int ret;
1122+
1123+ wolfIP_init(&s);
1124+ mock_link_init(&s);
1125+ wolfIP_ipconfig_set(&s, 0x0A000001U, 0xFFFFFF00U, 0);
1126+
1127+ sd = wolfIP_sock_socket(&s, AF_INET, IPSTACK_SOCK_RAW, WI_IPPROTO_UDP);
1128+ ck_assert_int_ge(sd, 0);
1129+
1130+ memset(frame, 0, sizeof(frame_buf));
1131+ memcpy(frame->eth.dst, s.ll_dev[TEST_PRIMARY_IF].mac, 6);
1132+ memcpy(frame->eth.src, "\xaa\xbb\xcc\xdd\xee\xff", 6);
1133+ frame->eth.type = ee16(ETH_TYPE_IP);
1134+ frame->ver_ihl = 0x45;
1135+ frame->ttl = 32;
1136+ frame->proto = WI_IPPROTO_UDP;
1137+ frame->len = ee16(IP_HEADER_LEN + sizeof(payload));
1138+ frame->src = ee32(0x0A000002U);
1139+ frame->dst = ee32(0x0A000001U);
1140+ memcpy(frame->data, payload, sizeof(payload));
1141+ memcpy(frame->data + sizeof(payload), padding, sizeof(padding));
1142+ frame->csum = 0;
1143+ iphdr_set_checksum(frame);
1144+
1145+ wolfIP_recv_ex(&s, TEST_PRIMARY_IF, frame,
1146+ ETH_HEADER_LEN + IP_HEADER_LEN + sizeof(payload) + sizeof(padding));
1147+
1148+ memset(rxbuf, 0, sizeof(rxbuf));
1149+ ret = wolfIP_sock_recvfrom(&s, sd, rxbuf, sizeof(rxbuf), 0, NULL, NULL);
1150+ ck_assert_int_eq(ret, (int)(IP_HEADER_LEN + sizeof(payload)));
1151+ ck_assert_mem_eq(rxbuf, ((uint8_t *)frame) + ETH_HEADER_LEN,
1152+ IP_HEADER_LEN + sizeof(payload));
1153+ }
1154+ END_TEST
1155+
11121156START_TEST(test_udp_short_frame_does_not_overread)
11131157{
11141158 struct wolfIP s;
@@ -18406,6 +18450,7 @@ Suite *wolf_suite(void)
1840618450 tcase_add_test(tc_proto, test_raw_socket_recv_protocol_mismatch);
1840718451 tcase_add_test(tc_proto, test_raw_socket_recv_short_frame_ignored);
1840818452 tcase_add_test(tc_proto, test_raw_socket_recv_too_short_drop_returns_einval);
18453+ tcase_add_test(tc_proto, test_raw_socket_recv_uses_ip_total_length);
1840918454 tcase_add_test(tc_proto, test_udp_short_frame_does_not_overread);
1841018455 tcase_add_test(tc_proto, test_raw_socket_close_clears_entry);
1841118456 tcase_add_test(tc_proto, test_packet_socket_close_clears_entry);
0 commit comments