Skip to content

Commit 9708338

Browse files
committed
Addressed more copilot's comments
1 parent 6319457 commit 9708338

4 files changed

Lines changed: 202 additions & 24 deletions

File tree

src/port/posix/bsd_socket.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1445,7 +1445,7 @@ int close(int sockfd) {
14451445
wolfip_fd_release(sockfd);
14461446
ret = wolfIP_sock_close(IPSTACK, internal_fd);
14471447
if (ret < 0) {
1448-
errno = ret;
1448+
errno = -ret;
14491449
pthread_mutex_unlock(&wolfIP_mutex);
14501450
return -1;
14511451
}

src/test/unit/unit.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -695,21 +695,27 @@ Suite *wolf_suite(void)
695695
tcase_add_test(tc_proto, test_raw_socket_send_hdrincl_respected);
696696
tcase_add_test(tc_proto, test_raw_socket_send_builds_ip_header);
697697
tcase_add_test(tc_proto, test_raw_socket_sendto_short_addrlen_returns_einval);
698+
tcase_add_test(tc_proto, test_raw_socket_sendto_wrong_family_returns_einval);
699+
tcase_add_test(tc_proto, test_raw_socket_sendto_payload_too_large_for_ip_header_returns_einval);
698700
tcase_add_test(tc_proto, test_getsockopt_invalid_fd_returns_einval);
699701
tcase_add_test(tc_proto, test_getsockopt_invalid_raw_fd_returns_einval);
700702
tcase_add_test(tc_proto, test_getsockopt_invalid_packet_fd_returns_einval);
701703
tcase_add_test(tc_proto, test_getsockopt_unsupported_option_returns_einval);
702704
tcase_add_test(tc_proto, test_packet_socket_recv_frame);
703705
tcase_add_test(tc_proto, test_packet_socket_send_frame);
706+
tcase_add_test(tc_proto, test_packet_socket_sendto_wrong_family_returns_einval);
707+
tcase_add_test(tc_proto, test_packet_socket_setsockopt_rejected);
704708
tcase_add_test(tc_proto, test_packet_socket_recv_wrong_proto_ignored);
705709
tcase_add_test(tc_proto, test_packet_socket_recv_other_interface_ignored);
706710
tcase_add_test(tc_proto, test_raw_socket_recv_protocol_mismatch);
707711
tcase_add_test(tc_proto, test_raw_socket_recv_short_frame_ignored);
708712
tcase_add_test(tc_proto, test_raw_socket_recv_too_short_drop_returns_einval);
709713
tcase_add_test(tc_proto, test_raw_socket_recvfrom_null_addrlen_rejected);
710714
tcase_add_test(tc_proto, test_raw_socket_recv_uses_ip_total_length);
715+
tcase_add_test(tc_proto, test_raw_socket_recv_oversize_drops_frame);
711716
tcase_add_test(tc_proto, test_udp_short_frame_does_not_overread);
712717
tcase_add_test(tc_proto, test_packet_socket_recvfrom_null_addrlen_rejected);
718+
tcase_add_test(tc_proto, test_packet_socket_recv_oversize_drops_frame);
713719
tcase_add_test(tc_proto, test_raw_socket_close_clears_entry);
714720
tcase_add_test(tc_proto, test_packet_socket_close_clears_entry);
715721
tcase_add_test(tc_proto, test_arp_lookup_ex_basic);

src/test/unit/unit_tests_proto.c

Lines changed: 168 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6098,6 +6098,56 @@ START_TEST(test_raw_socket_sendto_short_addrlen_returns_einval)
60986098
}
60996099
END_TEST
61006100

6101+
START_TEST(test_raw_socket_sendto_wrong_family_returns_einval)
6102+
{
6103+
struct wolfIP s;
6104+
int sd;
6105+
struct wolfIP_sockaddr_in sin;
6106+
uint8_t payload[4] = {0xDE, 0xAD, 0xBE, 0xEF};
6107+
6108+
wolfIP_init(&s);
6109+
mock_link_init(&s);
6110+
wolfIP_ipconfig_set(&s, 0x0A000001U, 0xFFFFFF00U, 0);
6111+
6112+
sd = wolfIP_sock_socket(&s, AF_INET, IPSTACK_SOCK_RAW, WI_IPPROTO_UDP);
6113+
ck_assert_int_ge(sd, 0);
6114+
6115+
memset(&sin, 0, sizeof(sin));
6116+
sin.sin_family = AF_PACKET;
6117+
sin.sin_addr.s_addr = ee32(0x0A000002U);
6118+
6119+
ck_assert_int_eq(wolfIP_sock_sendto(&s, sd, payload, sizeof(payload), 0,
6120+
(struct wolfIP_sockaddr *)&sin, sizeof(sin)),
6121+
-WOLFIP_EINVAL);
6122+
}
6123+
END_TEST
6124+
6125+
START_TEST(test_raw_socket_sendto_payload_too_large_for_ip_header_returns_einval)
6126+
{
6127+
struct wolfIP s;
6128+
int sd;
6129+
struct wolfIP_sockaddr_in sin;
6130+
uint8_t payload[LINK_MTU];
6131+
size_t len = (size_t)(LINK_MTU - ETH_HEADER_LEN - IP_HEADER_LEN + 1);
6132+
6133+
wolfIP_init(&s);
6134+
mock_link_init(&s);
6135+
wolfIP_ipconfig_set(&s, 0x0A000001U, 0xFFFFFF00U, 0);
6136+
6137+
sd = wolfIP_sock_socket(&s, AF_INET, IPSTACK_SOCK_RAW, WI_IPPROTO_UDP);
6138+
ck_assert_int_ge(sd, 0);
6139+
6140+
memset(&sin, 0, sizeof(sin));
6141+
sin.sin_family = AF_INET;
6142+
sin.sin_addr.s_addr = ee32(0x0A000002U);
6143+
memset(payload, 0xAA, len);
6144+
6145+
ck_assert_int_eq(wolfIP_sock_sendto(&s, sd, payload, len, 0,
6146+
(struct wolfIP_sockaddr *)&sin, sizeof(sin)),
6147+
-WOLFIP_EINVAL);
6148+
}
6149+
END_TEST
6150+
61016151
START_TEST(test_getsockopt_invalid_fd_returns_einval)
61026152
{
61036153
struct wolfIP s;
@@ -6176,12 +6226,12 @@ START_TEST(test_packet_socket_recv_frame)
61766226
ll = wolfIP_getdev_ex(&s, TEST_PRIMARY_IF);
61776227
ck_assert_ptr_nonnull(ll);
61786228

6179-
sd = wolfIP_sock_socket(&s, AF_PACKET, IPSTACK_SOCK_RAW, ETH_TYPE_IP);
6229+
sd = wolfIP_sock_socket(&s, AF_PACKET, IPSTACK_SOCK_RAW, ee16(ETH_TYPE_IP));
61806230
ck_assert_int_ge(sd, 0);
61816231

61826232
memset(&bind_sll, 0, sizeof(bind_sll));
61836233
bind_sll.sll_family = AF_PACKET;
6184-
bind_sll.sll_protocol = ETH_TYPE_IP;
6234+
bind_sll.sll_protocol = ee16(ETH_TYPE_IP);
61856235
bind_sll.sll_ifindex = TEST_PRIMARY_IF;
61866236
bind_sll.sll_halen = 6;
61876237
ck_assert_int_eq(wolfIP_sock_bind(&s, sd,
@@ -6190,7 +6240,7 @@ START_TEST(test_packet_socket_recv_frame)
61906240
memset(frame, 0, sizeof(frame_buf));
61916241
memcpy(frame->dst, ll->mac, 6);
61926242
memcpy(frame->src, "\xaa\xbb\xcc\xdd\xee\xff", 6);
6193-
frame->type = ETH_TYPE_IP;
6243+
frame->type = ee16(ETH_TYPE_IP);
61946244
memcpy(frame->data, payload, sizeof(payload));
61956245

61966246
wolfIP_recv_ex(&s, TEST_PRIMARY_IF, frame,
@@ -6229,12 +6279,12 @@ START_TEST(test_packet_socket_send_frame)
62296279
ll = wolfIP_getdev_ex(&s, TEST_PRIMARY_IF);
62306280
ck_assert_ptr_nonnull(ll);
62316281

6232-
sd = wolfIP_sock_socket(&s, AF_PACKET, IPSTACK_SOCK_RAW, ETH_TYPE_IP);
6282+
sd = wolfIP_sock_socket(&s, AF_PACKET, IPSTACK_SOCK_RAW, ee16(ETH_TYPE_IP));
62336283
ck_assert_int_ge(sd, 0);
62346284

62356285
memset(&bind_sll, 0, sizeof(bind_sll));
62366286
bind_sll.sll_family = AF_PACKET;
6237-
bind_sll.sll_protocol = ETH_TYPE_IP;
6287+
bind_sll.sll_protocol = ee16(ETH_TYPE_IP);
62386288
bind_sll.sll_ifindex = TEST_PRIMARY_IF;
62396289
bind_sll.sll_halen = 6;
62406290
memset(bind_sll.sll_addr, 0xFF, 6);
@@ -6243,15 +6293,15 @@ START_TEST(test_packet_socket_send_frame)
62436293

62446294
memset(&sll, 0, sizeof(sll));
62456295
sll.sll_family = AF_PACKET;
6246-
sll.sll_protocol = ETH_TYPE_IP;
6296+
sll.sll_protocol = ee16(ETH_TYPE_IP);
62476297
sll.sll_ifindex = TEST_PRIMARY_IF;
62486298
sll.sll_halen = 6;
62496299
memset(sll.sll_addr, 0xFF, 6);
62506300

62516301
memset(frame_buf, 0, sizeof(frame_buf));
62526302
memcpy(ethf->dst, "\xff\xff\xff\xff\xff\xff", 6);
62536303
memcpy(ethf->src, "\x00\x00\x00\x00\x00\x01", 6);
6254-
ethf->type = ETH_TYPE_IP;
6304+
ethf->type = ee16(ETH_TYPE_IP);
62556305
memset(ethf->data, 0xAB, 8);
62566306

62576307
ck_assert_int_eq(wolfIP_sock_sendto(&s, sd, frame_buf, sizeof(frame_buf), 0,
@@ -6266,7 +6316,7 @@ START_TEST(test_packet_socket_send_frame)
62666316
ck_assert_uint_eq(desc->len, sizeof(frame_buf));
62676317
ck_assert_mem_eq(queued->dst, "\xff\xff\xff\xff\xff\xff", 6);
62686318
ck_assert_mem_eq(queued->src, ll->mac, 6);
6269-
ck_assert_uint_eq(queued->type, ETH_TYPE_IP);
6319+
ck_assert_uint_eq(queued->type, ee16(ETH_TYPE_IP));
62706320
ck_assert_mem_eq(queued->data, ethf->data, 8);
62716321
}
62726322
ck_assert_uint_eq(ps->if_idx, TEST_PRIMARY_IF);
@@ -6277,6 +6327,54 @@ START_TEST(test_packet_socket_send_frame)
62776327
}
62786328
END_TEST
62796329

6330+
START_TEST(test_packet_socket_sendto_wrong_family_returns_einval)
6331+
{
6332+
#if WOLFIP_PACKET_SOCKETS
6333+
struct wolfIP s;
6334+
int sd;
6335+
struct wolfIP_sockaddr_ll sll;
6336+
uint8_t frame_buf[ETH_HEADER_LEN + 8];
6337+
6338+
wolfIP_init(&s);
6339+
mock_link_init(&s);
6340+
6341+
sd = wolfIP_sock_socket(&s, AF_PACKET, IPSTACK_SOCK_RAW, ee16(ETH_TYPE_IP));
6342+
ck_assert_int_ge(sd, 0);
6343+
6344+
memset(&sll, 0, sizeof(sll));
6345+
sll.sll_family = AF_INET;
6346+
sll.sll_protocol = ee16(ETH_TYPE_IP);
6347+
6348+
memset(frame_buf, 0xAB, sizeof(frame_buf));
6349+
ck_assert_int_eq(wolfIP_sock_sendto(&s, sd, frame_buf, sizeof(frame_buf), 0,
6350+
(struct wolfIP_sockaddr *)&sll, sizeof(sll)),
6351+
-WOLFIP_EINVAL);
6352+
#else
6353+
ck_abort_msg("WOLFIP_PACKET_SOCKETS disabled");
6354+
#endif
6355+
}
6356+
END_TEST
6357+
6358+
START_TEST(test_packet_socket_setsockopt_rejected)
6359+
{
6360+
#if WOLFIP_PACKET_SOCKETS
6361+
struct wolfIP s;
6362+
int sd;
6363+
int one = 1;
6364+
6365+
wolfIP_init(&s);
6366+
mock_link_init(&s);
6367+
6368+
sd = wolfIP_sock_socket(&s, AF_PACKET, IPSTACK_SOCK_RAW, ee16(ETH_TYPE_IP));
6369+
ck_assert_int_ge(sd, 0);
6370+
ck_assert_int_eq(wolfIP_sock_setsockopt(&s, sd, WOLFIP_SOL_IP, WOLFIP_IP_RECVTTL,
6371+
&one, sizeof(one)), -WOLFIP_EINVAL);
6372+
#else
6373+
ck_abort_msg("WOLFIP_PACKET_SOCKETS disabled");
6374+
#endif
6375+
}
6376+
END_TEST
6377+
62806378
START_TEST(test_packet_socket_recv_wrong_proto_ignored)
62816379
{
62826380
#if WOLFIP_PACKET_SOCKETS
@@ -6292,7 +6390,7 @@ START_TEST(test_packet_socket_recv_wrong_proto_ignored)
62926390
ll = wolfIP_getdev_ex(&s, TEST_PRIMARY_IF);
62936391
ck_assert_ptr_nonnull(ll);
62946392

6295-
sd = wolfIP_sock_socket(&s, AF_PACKET, IPSTACK_SOCK_RAW, ETH_TYPE_IP);
6393+
sd = wolfIP_sock_socket(&s, AF_PACKET, IPSTACK_SOCK_RAW, ee16(ETH_TYPE_IP));
62966394
ck_assert_int_ge(sd, 0);
62976395

62986396
memset(frame, 0, sizeof(frame_buf));
@@ -6325,14 +6423,14 @@ START_TEST(test_packet_socket_recv_other_interface_ignored)
63256423
mock_link_init(&s);
63266424
mock_link_init_idx(&s, TEST_SECOND_IF, other_mac);
63276425

6328-
sd = wolfIP_sock_socket(&s, AF_PACKET, IPSTACK_SOCK_RAW, ETH_TYPE_IP);
6426+
sd = wolfIP_sock_socket(&s, AF_PACKET, IPSTACK_SOCK_RAW, ee16(ETH_TYPE_IP));
63296427
ck_assert_int_ge(sd, 0);
63306428

63316429
{
63326430
struct wolfIP_sockaddr_ll bind_sll;
63336431
memset(&bind_sll, 0, sizeof(bind_sll));
63346432
bind_sll.sll_family = AF_PACKET;
6335-
bind_sll.sll_protocol = ETH_TYPE_IP;
6433+
bind_sll.sll_protocol = ee16(ETH_TYPE_IP);
63366434
bind_sll.sll_ifindex = TEST_PRIMARY_IF;
63376435
bind_sll.sll_halen = 6;
63386436
ck_assert_int_eq(wolfIP_sock_bind(&s, sd,
@@ -6342,7 +6440,7 @@ START_TEST(test_packet_socket_recv_other_interface_ignored)
63426440
memset(frame, 0, sizeof(frame_buf));
63436441
memcpy(frame->dst, other_mac, 6);
63446442
memcpy(frame->src, "\xaa\xbb\xcc\xdd\xee\xff", 6);
6345-
frame->type = ETH_TYPE_IP;
6443+
frame->type = ee16(ETH_TYPE_IP);
63466444
memset(frame->data, 0xBB, 6);
63476445

63486446
wolfIP_recv_ex(&s, TEST_SECOND_IF, frame, (uint32_t)(ETH_HEADER_LEN + 6));
@@ -6543,6 +6641,31 @@ START_TEST(test_raw_socket_recv_uses_ip_total_length)
65436641
}
65446642
END_TEST
65456643

6644+
START_TEST(test_raw_socket_recv_oversize_drops_frame)
6645+
{
6646+
struct wolfIP s;
6647+
int sd;
6648+
struct rawsocket *rs;
6649+
uint8_t pkt[IP_HEADER_LEN + 8];
6650+
uint8_t rxbuf[4];
6651+
6652+
wolfIP_init(&s);
6653+
mock_link_init(&s);
6654+
6655+
sd = wolfIP_sock_socket(&s, AF_INET, IPSTACK_SOCK_RAW, WI_IPPROTO_UDP);
6656+
ck_assert_int_ge(sd, 0);
6657+
rs = &s.rawsockets[SOCKET_UNMARK(sd)];
6658+
6659+
memset(pkt, 0, sizeof(pkt));
6660+
pkt[0] = 0x45;
6661+
ck_assert_int_eq(fifo_push(&rs->rxbuf, pkt, sizeof(pkt)), 0);
6662+
6663+
ck_assert_int_eq(wolfIP_sock_recvfrom(&s, sd, rxbuf, sizeof(rxbuf), 0, NULL, NULL),
6664+
-WOLFIP_EINVAL);
6665+
ck_assert_ptr_eq(fifo_peek(&rs->rxbuf), NULL);
6666+
}
6667+
END_TEST
6668+
65466669
START_TEST(test_udp_short_frame_does_not_overread)
65476670
{
65486671
struct wolfIP s;
@@ -6591,13 +6714,13 @@ START_TEST(test_packet_socket_recvfrom_null_addrlen_rejected)
65916714
wolfIP_init(&s);
65926715
mock_link_init(&s);
65936716

6594-
sd = wolfIP_sock_socket(&s, AF_PACKET, IPSTACK_SOCK_RAW, ETH_TYPE_IP);
6717+
sd = wolfIP_sock_socket(&s, AF_PACKET, IPSTACK_SOCK_RAW, ee16(ETH_TYPE_IP));
65956718
ck_assert_int_ge(sd, 0);
65966719

65976720
memset(frame, 0, sizeof(frame_buf));
65986721
memcpy(frame->dst, s.ll_dev[TEST_PRIMARY_IF].mac, 6);
65996722
memcpy(frame->src, "\xaa\xbb\xcc\xdd\xee\xff", 6);
6600-
frame->type = ETH_TYPE_IP;
6723+
frame->type = ee16(ETH_TYPE_IP);
66016724
memset(frame->data, 0xAA, 4);
66026725

66036726
wolfIP_recv_ex(&s, TEST_PRIMARY_IF, frame, (uint32_t)sizeof(frame_buf));
@@ -6610,6 +6733,37 @@ START_TEST(test_packet_socket_recvfrom_null_addrlen_rejected)
66106733
}
66116734
END_TEST
66126735

6736+
START_TEST(test_packet_socket_recv_oversize_drops_frame)
6737+
{
6738+
#if WOLFIP_PACKET_SOCKETS
6739+
struct wolfIP s;
6740+
int sd;
6741+
struct packetsocket *ps;
6742+
uint8_t record[1 + ETH_HEADER_LEN + 8];
6743+
struct wolfIP_eth_frame *frame = (struct wolfIP_eth_frame *)(record + 1);
6744+
uint8_t rxbuf[4];
6745+
6746+
wolfIP_init(&s);
6747+
mock_link_init(&s);
6748+
6749+
sd = wolfIP_sock_socket(&s, AF_PACKET, IPSTACK_SOCK_RAW, ee16(ETH_TYPE_IP));
6750+
ck_assert_int_ge(sd, 0);
6751+
ps = &s.packetsockets[SOCKET_UNMARK(sd)];
6752+
6753+
memset(record, 0, sizeof(record));
6754+
record[0] = (uint8_t)TEST_PRIMARY_IF;
6755+
frame->type = ee16(ETH_TYPE_IP);
6756+
ck_assert_int_eq(fifo_push(&ps->rxbuf, record, sizeof(record)), 0);
6757+
6758+
ck_assert_int_eq(wolfIP_sock_recvfrom(&s, sd, rxbuf, sizeof(rxbuf), 0, NULL, NULL),
6759+
-WOLFIP_EINVAL);
6760+
ck_assert_ptr_eq(fifo_peek(&ps->rxbuf), NULL);
6761+
#else
6762+
ck_abort_msg("WOLFIP_PACKET_SOCKETS disabled");
6763+
#endif
6764+
}
6765+
END_TEST
6766+
66136767
START_TEST(test_packet_socket_close_clears_entry)
66146768
{
66156769
#if WOLFIP_PACKET_SOCKETS

0 commit comments

Comments
 (0)