Skip to content

Commit 6319457

Browse files
committed
Addressed copilot's comments.
1 parent 56e0a88 commit 6319457

4 files changed

Lines changed: 78 additions & 1 deletion

File tree

src/port/posix/bsd_socket.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1402,7 +1402,7 @@ int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen) {
14021402
(const struct wolfIP_sockaddr *)addr, addrlen);
14031403
}
14041404
if (ret < 0) {
1405-
errno = ret;
1405+
errno = -ret;
14061406
pthread_mutex_unlock(&wolfIP_mutex);
14071407
return -1;
14081408
}
@@ -2020,6 +2020,7 @@ void __attribute__((constructor)) init_wolfip_posix() {
20202020
tapdev = wolfIP_getdev(IPSTACK);
20212021
if (!tapdev) {
20222022
fprintf(stderr, "wolfIP_getdev returned NULL\n");
2023+
pthread_mutex_unlock(&wolfIP_mutex);
20232024
return;
20242025
}
20252026
#if WOLFIP_USE_VDE

src/test/unit/unit.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -706,8 +706,10 @@ Suite *wolf_suite(void)
706706
tcase_add_test(tc_proto, test_raw_socket_recv_protocol_mismatch);
707707
tcase_add_test(tc_proto, test_raw_socket_recv_short_frame_ignored);
708708
tcase_add_test(tc_proto, test_raw_socket_recv_too_short_drop_returns_einval);
709+
tcase_add_test(tc_proto, test_raw_socket_recvfrom_null_addrlen_rejected);
709710
tcase_add_test(tc_proto, test_raw_socket_recv_uses_ip_total_length);
710711
tcase_add_test(tc_proto, test_udp_short_frame_does_not_overread);
712+
tcase_add_test(tc_proto, test_packet_socket_recvfrom_null_addrlen_rejected);
711713
tcase_add_test(tc_proto, test_raw_socket_close_clears_entry);
712714
tcase_add_test(tc_proto, test_packet_socket_close_clears_entry);
713715
tcase_add_test(tc_proto, test_arp_lookup_ex_basic);

src/test/unit/unit_tests_proto.c

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6461,6 +6461,44 @@ START_TEST(test_raw_socket_recv_too_short_drop_returns_einval)
64616461
}
64626462
END_TEST
64636463

6464+
START_TEST(test_raw_socket_recvfrom_null_addrlen_rejected)
6465+
{
6466+
struct wolfIP s;
6467+
int sd;
6468+
uint8_t frame_buf[sizeof(struct wolfIP_ip_packet) + 4];
6469+
struct wolfIP_ip_packet *frame = (struct wolfIP_ip_packet *)frame_buf;
6470+
uint8_t payload[4] = {1, 2, 3, 4};
6471+
struct wolfIP_sockaddr_in from;
6472+
uint8_t rxbuf[32];
6473+
6474+
wolfIP_init(&s);
6475+
mock_link_init(&s);
6476+
wolfIP_ipconfig_set(&s, 0x0A000001U, 0xFFFFFF00U, 0);
6477+
6478+
sd = wolfIP_sock_socket(&s, AF_INET, IPSTACK_SOCK_RAW, WI_IPPROTO_UDP);
6479+
ck_assert_int_ge(sd, 0);
6480+
6481+
memset(frame, 0, sizeof(frame_buf));
6482+
memcpy(frame->eth.dst, s.ll_dev[TEST_PRIMARY_IF].mac, 6);
6483+
memcpy(frame->eth.src, "\xaa\xbb\xcc\xdd\xee\xff", 6);
6484+
frame->eth.type = ee16(ETH_TYPE_IP);
6485+
frame->ver_ihl = 0x45;
6486+
frame->ttl = 32;
6487+
frame->proto = WI_IPPROTO_UDP;
6488+
frame->len = ee16(IP_HEADER_LEN + sizeof(payload));
6489+
frame->src = ee32(0x0A000002U);
6490+
frame->dst = ee32(0x0A000001U);
6491+
memcpy(frame->data, payload, sizeof(payload));
6492+
frame->csum = 0;
6493+
iphdr_set_checksum(frame);
6494+
6495+
wolfIP_recv_ex(&s, TEST_PRIMARY_IF, frame, ETH_HEADER_LEN + IP_HEADER_LEN + sizeof(payload));
6496+
6497+
ck_assert_int_eq(wolfIP_sock_recvfrom(&s, sd, rxbuf, sizeof(rxbuf), 0,
6498+
(struct wolfIP_sockaddr *)&from, NULL), -WOLFIP_EINVAL);
6499+
}
6500+
END_TEST
6501+
64646502
START_TEST(test_raw_socket_recv_uses_ip_total_length)
64656503
{
64666504
struct wolfIP s;
@@ -6540,6 +6578,38 @@ START_TEST(test_udp_short_frame_does_not_overread)
65406578
}
65416579
END_TEST
65426580

6581+
START_TEST(test_packet_socket_recvfrom_null_addrlen_rejected)
6582+
{
6583+
#if WOLFIP_PACKET_SOCKETS
6584+
struct wolfIP s;
6585+
int sd;
6586+
uint8_t frame_buf[ETH_HEADER_LEN + 4];
6587+
struct wolfIP_eth_frame *frame = (struct wolfIP_eth_frame *)frame_buf;
6588+
struct wolfIP_sockaddr_ll from;
6589+
uint8_t rxbuf[32];
6590+
6591+
wolfIP_init(&s);
6592+
mock_link_init(&s);
6593+
6594+
sd = wolfIP_sock_socket(&s, AF_PACKET, IPSTACK_SOCK_RAW, ETH_TYPE_IP);
6595+
ck_assert_int_ge(sd, 0);
6596+
6597+
memset(frame, 0, sizeof(frame_buf));
6598+
memcpy(frame->dst, s.ll_dev[TEST_PRIMARY_IF].mac, 6);
6599+
memcpy(frame->src, "\xaa\xbb\xcc\xdd\xee\xff", 6);
6600+
frame->type = ETH_TYPE_IP;
6601+
memset(frame->data, 0xAA, 4);
6602+
6603+
wolfIP_recv_ex(&s, TEST_PRIMARY_IF, frame, (uint32_t)sizeof(frame_buf));
6604+
6605+
ck_assert_int_eq(wolfIP_sock_recvfrom(&s, sd, rxbuf, sizeof(rxbuf), 0,
6606+
(struct wolfIP_sockaddr *)&from, NULL), -WOLFIP_EINVAL);
6607+
#else
6608+
ck_abort_msg("WOLFIP_PACKET_SOCKETS disabled");
6609+
#endif
6610+
}
6611+
END_TEST
6612+
65436613
START_TEST(test_packet_socket_close_clears_entry)
65446614
{
65456615
#if WOLFIP_PACKET_SOCKETS

src/wolfip.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5699,6 +5699,8 @@ int wolfIP_sock_recvfrom(struct wolfIP *s, int sockfd, void *buf, size_t len, in
56995699
rs = wolfIP_rawsocket_from_fd(s, sockfd);
57005700
if (!rs)
57015701
return -WOLFIP_EINVAL;
5702+
if (sin && !addrlen)
5703+
return -WOLFIP_EINVAL;
57025704
if (sin && addrlen && *addrlen < sizeof(struct wolfIP_sockaddr_in))
57035705
return -WOLFIP_EINVAL;
57045706
desc = fifo_peek(&rs->rxbuf);
@@ -5736,6 +5738,8 @@ int wolfIP_sock_recvfrom(struct wolfIP *s, int sockfd, void *buf, size_t len, in
57365738
uint8_t *pkt;
57375739
if (!ps)
57385740
return -WOLFIP_EINVAL;
5741+
if (sll && !addrlen)
5742+
return -WOLFIP_EINVAL;
57395743
if (sll && addrlen && *addrlen < sizeof(struct wolfIP_sockaddr_ll))
57405744
return -WOLFIP_EINVAL;
57415745
desc = fifo_peek(&ps->rxbuf);

0 commit comments

Comments
 (0)