Skip to content

Commit 19a244b

Browse files
committed
wolfIP_sock_recvfrom: added more corner-cases UT
1 parent 51f67b1 commit 19a244b

1 file changed

Lines changed: 127 additions & 0 deletions

File tree

src/test/unit/unit.c

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1085,6 +1085,127 @@ START_TEST(test_udp_recvfrom_sets_remote_ip)
10851085
}
10861086
END_TEST
10871087

1088+
START_TEST(test_udp_recvfrom_null_src_addr_len)
1089+
{
1090+
struct wolfIP s;
1091+
int sd;
1092+
struct wolfIP_sockaddr_in sin;
1093+
uint8_t payload[4] = {0x11, 0x22, 0x33, 0x44};
1094+
uint8_t rxbuf[4] = {0};
1095+
int ret;
1096+
ip4 local_ip = 0x0A000001U;
1097+
ip4 remote_ip = 0x0A000002U;
1098+
uint16_t local_port = 4002;
1099+
uint16_t remote_port = 5002;
1100+
1101+
wolfIP_init(&s);
1102+
mock_link_init(&s);
1103+
wolfIP_ipconfig_set(&s, local_ip, 0xFFFFFF00U, 0);
1104+
1105+
sd = wolfIP_sock_socket(&s, AF_INET, IPSTACK_SOCK_DGRAM, WI_IPPROTO_UDP);
1106+
ck_assert_int_gt(sd, 0);
1107+
1108+
memset(&sin, 0, sizeof(sin));
1109+
sin.sin_family = AF_INET;
1110+
sin.sin_port = ee16(local_port);
1111+
sin.sin_addr.s_addr = ee32(local_ip);
1112+
ret = wolfIP_sock_bind(&s, sd, (struct wolfIP_sockaddr *)&sin, sizeof(sin));
1113+
ck_assert_int_eq(ret, 0);
1114+
1115+
inject_udp_datagram(&s, TEST_PRIMARY_IF, remote_ip, local_ip, remote_port, local_port,
1116+
payload, sizeof(payload));
1117+
1118+
ret = wolfIP_sock_recvfrom(&s, sd, rxbuf, sizeof(rxbuf), 0, NULL, NULL);
1119+
ck_assert_int_eq(ret, (int)sizeof(payload));
1120+
ck_assert_mem_eq(rxbuf, payload, sizeof(payload));
1121+
}
1122+
END_TEST
1123+
1124+
START_TEST(test_udp_recvfrom_preserves_remote_ip)
1125+
{
1126+
struct wolfIP s;
1127+
int sd;
1128+
struct wolfIP_sockaddr_in sin;
1129+
uint8_t payload[4] = {0x55, 0x66, 0x77, 0x88};
1130+
uint8_t rxbuf[4] = {0};
1131+
struct wolfIP_sockaddr_in from;
1132+
socklen_t from_len = sizeof(from);
1133+
int ret;
1134+
ip4 local_ip = 0x0A000001U;
1135+
ip4 remote_ip = 0x0A000002U;
1136+
ip4 preset_remote_ip = 0x0A000099U;
1137+
uint16_t local_port = 4003;
1138+
uint16_t remote_port = 5003;
1139+
struct tsocket *ts;
1140+
1141+
wolfIP_init(&s);
1142+
mock_link_init(&s);
1143+
wolfIP_ipconfig_set(&s, local_ip, 0xFFFFFF00U, 0);
1144+
1145+
sd = wolfIP_sock_socket(&s, AF_INET, IPSTACK_SOCK_DGRAM, WI_IPPROTO_UDP);
1146+
ck_assert_int_gt(sd, 0);
1147+
1148+
memset(&sin, 0, sizeof(sin));
1149+
sin.sin_family = AF_INET;
1150+
sin.sin_port = ee16(local_port);
1151+
sin.sin_addr.s_addr = ee32(local_ip);
1152+
ret = wolfIP_sock_bind(&s, sd, (struct wolfIP_sockaddr *)&sin, sizeof(sin));
1153+
ck_assert_int_eq(ret, 0);
1154+
1155+
ts = &s.udpsockets[SOCKET_UNMARK(sd)];
1156+
ts->remote_ip = preset_remote_ip;
1157+
1158+
inject_udp_datagram(&s, TEST_PRIMARY_IF, remote_ip, local_ip, remote_port, local_port,
1159+
payload, sizeof(payload));
1160+
1161+
memset(&from, 0, sizeof(from));
1162+
ret = wolfIP_sock_recvfrom(&s, sd, rxbuf, sizeof(rxbuf), 0,
1163+
(struct wolfIP_sockaddr *)&from, &from_len);
1164+
ck_assert_int_eq(ret, (int)sizeof(payload));
1165+
ck_assert_mem_eq(rxbuf, payload, sizeof(payload));
1166+
ck_assert_uint_eq(from.sin_addr.s_addr, ee32(remote_ip));
1167+
ck_assert_uint_eq(ts->remote_ip, preset_remote_ip);
1168+
}
1169+
END_TEST
1170+
1171+
START_TEST(test_udp_recvfrom_null_addrlen)
1172+
{
1173+
struct wolfIP s;
1174+
int sd;
1175+
struct wolfIP_sockaddr_in sin;
1176+
uint8_t payload[4] = {0x9A, 0xBC, 0xDE, 0xF0};
1177+
uint8_t rxbuf[4] = {0};
1178+
struct wolfIP_sockaddr_in from;
1179+
int ret;
1180+
ip4 local_ip = 0x0A000001U;
1181+
ip4 remote_ip = 0x0A000002U;
1182+
uint16_t local_port = 4004;
1183+
uint16_t remote_port = 5004;
1184+
1185+
wolfIP_init(&s);
1186+
mock_link_init(&s);
1187+
wolfIP_ipconfig_set(&s, local_ip, 0xFFFFFF00U, 0);
1188+
1189+
sd = wolfIP_sock_socket(&s, AF_INET, IPSTACK_SOCK_DGRAM, WI_IPPROTO_UDP);
1190+
ck_assert_int_gt(sd, 0);
1191+
1192+
memset(&sin, 0, sizeof(sin));
1193+
sin.sin_family = AF_INET;
1194+
sin.sin_port = ee16(local_port);
1195+
sin.sin_addr.s_addr = ee32(local_ip);
1196+
ret = wolfIP_sock_bind(&s, sd, (struct wolfIP_sockaddr *)&sin, sizeof(sin));
1197+
ck_assert_int_eq(ret, 0);
1198+
1199+
inject_udp_datagram(&s, TEST_PRIMARY_IF, remote_ip, local_ip, remote_port, local_port,
1200+
payload, sizeof(payload));
1201+
1202+
memset(&from, 0, sizeof(from));
1203+
ret = wolfIP_sock_recvfrom(&s, sd, rxbuf, sizeof(rxbuf), 0,
1204+
(struct wolfIP_sockaddr *)&from, NULL);
1205+
ck_assert_int_eq(ret, -1);
1206+
}
1207+
END_TEST
1208+
10881209
START_TEST(test_sock_error_paths)
10891210
{
10901211
struct wolfIP s;
@@ -12130,6 +12251,12 @@ Suite *wolf_suite(void)
1213012251
suite_add_tcase(s, tc_proto);
1213112252
tcase_add_test(tc_proto, test_udp_recvfrom_sets_remote_ip);
1213212253
suite_add_tcase(s, tc_proto);
12254+
tcase_add_test(tc_proto, test_udp_recvfrom_null_src_addr_len);
12255+
suite_add_tcase(s, tc_proto);
12256+
tcase_add_test(tc_proto, test_udp_recvfrom_preserves_remote_ip);
12257+
suite_add_tcase(s, tc_proto);
12258+
tcase_add_test(tc_proto, test_udp_recvfrom_null_addrlen);
12259+
suite_add_tcase(s, tc_proto);
1213312260
tcase_add_test(tc_proto, test_dns_query_and_callback_a);
1213412261
suite_add_tcase(s, tc_proto);
1213512262
tcase_add_test(tc_proto, test_dhcp_parse_offer_and_ack);

0 commit comments

Comments
 (0)