@@ -1085,6 +1085,127 @@ START_TEST(test_udp_recvfrom_sets_remote_ip)
10851085}
10861086END_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+
10881209START_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