Skip to content

Commit a048ec8

Browse files
committed
Addressed more copilot review comments
1 parent c8999d8 commit a048ec8

4 files changed

Lines changed: 55 additions & 2 deletions

File tree

src/port/posix/bsd_socket.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
#include <sys/uio.h>
4040
#include <net/if.h>
4141
#include <net/if_arp.h>
42+
#include <stdint.h>
4243
#include <limits.h>
4344
#include <fcntl.h>
4445
#include <stdio.h>
@@ -1236,13 +1237,13 @@ int wolfIP_sock_select(struct wolfIP *ipstack, int nfds, fd_set *readfds, fd_set
12361237
int ioctl(int fd, unsigned long request, ...)
12371238
{
12381239
va_list ap;
1239-
unsigned long arg;
1240+
uintptr_t arg;
12401241
void *argp;
12411242
struct ifreq *ifr;
12421243
int i;
12431244

12441245
va_start(ap, request);
1245-
arg = va_arg(ap, unsigned long);
1246+
arg = va_arg(ap, uintptr_t);
12461247
va_end(ap);
12471248
argp = (void *)arg;
12481249

src/test/unit/unit.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -706,6 +706,7 @@ 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_recv_uses_ip_total_length);
709710
tcase_add_test(tc_proto, test_udp_short_frame_does_not_overread);
710711
tcase_add_test(tc_proto, test_raw_socket_close_clears_entry);
711712
tcase_add_test(tc_proto, test_packet_socket_close_clears_entry);

src/test/unit/unit_tests_proto.c

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

6464+
START_TEST(test_raw_socket_recv_uses_ip_total_length)
6465+
{
6466+
struct wolfIP s;
6467+
int sd;
6468+
uint8_t frame_buf[ETH_HEADER_LEN + IP_HEADER_LEN + 6];
6469+
struct wolfIP_ip_packet *frame = (struct wolfIP_ip_packet *)frame_buf;
6470+
uint8_t payload[2] = {0xAB, 0xCD};
6471+
uint8_t padding[4] = {0x99, 0x98, 0x97, 0x96};
6472+
uint8_t rxbuf[64];
6473+
int ret;
6474+
6475+
wolfIP_init(&s);
6476+
mock_link_init(&s);
6477+
wolfIP_ipconfig_set(&s, 0x0A000001U, 0xFFFFFF00U, 0);
6478+
6479+
sd = wolfIP_sock_socket(&s, AF_INET, IPSTACK_SOCK_RAW, WI_IPPROTO_UDP);
6480+
ck_assert_int_ge(sd, 0);
6481+
6482+
memset(frame, 0, sizeof(frame_buf));
6483+
memcpy(frame->eth.dst, s.ll_dev[TEST_PRIMARY_IF].mac, 6);
6484+
memcpy(frame->eth.src, "\xaa\xbb\xcc\xdd\xee\xff", 6);
6485+
frame->eth.type = ee16(ETH_TYPE_IP);
6486+
frame->ver_ihl = 0x45;
6487+
frame->ttl = 32;
6488+
frame->proto = WI_IPPROTO_UDP;
6489+
frame->len = ee16(IP_HEADER_LEN + sizeof(payload));
6490+
frame->src = ee32(0x0A000002U);
6491+
frame->dst = ee32(0x0A000001U);
6492+
memcpy(frame->data, payload, sizeof(payload));
6493+
memcpy(frame->data + sizeof(payload), padding, sizeof(padding));
6494+
frame->csum = 0;
6495+
iphdr_set_checksum(frame);
6496+
6497+
wolfIP_recv_ex(&s, TEST_PRIMARY_IF, frame,
6498+
ETH_HEADER_LEN + IP_HEADER_LEN + sizeof(payload) + sizeof(padding));
6499+
6500+
memset(rxbuf, 0, sizeof(rxbuf));
6501+
ret = wolfIP_sock_recvfrom(&s, sd, rxbuf, sizeof(rxbuf), 0, NULL, NULL);
6502+
ck_assert_int_eq(ret, (int)(IP_HEADER_LEN + sizeof(payload)));
6503+
ck_assert_mem_eq(rxbuf, ((uint8_t *)frame) + ETH_HEADER_LEN,
6504+
IP_HEADER_LEN + sizeof(payload));
6505+
}
6506+
END_TEST
6507+
64646508
START_TEST(test_udp_short_frame_does_not_overread)
64656509
{
64666510
struct wolfIP s;

src/wolfip.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2317,6 +2317,7 @@ static void raw_try_recv(struct wolfIP *s, unsigned int if_idx, struct wolfIP_ip
23172317
{
23182318
uint32_t payload_len = frame_len;
23192319
const uint8_t *packet = (const uint8_t *)ip;
2320+
uint32_t ip_len;
23202321
#ifdef ETHERNET
23212322
if (frame_len <= ETH_HEADER_LEN)
23222323
return;
@@ -2325,6 +2326,12 @@ static void raw_try_recv(struct wolfIP *s, unsigned int if_idx, struct wolfIP_ip
23252326
#endif
23262327
if (payload_len < IP_HEADER_LEN)
23272328
return;
2329+
ip_len = (uint32_t)ee16(ip->len);
2330+
if (ip_len < IP_HEADER_LEN)
2331+
return;
2332+
if (ip_len > payload_len)
2333+
return;
2334+
payload_len = ip_len;
23282335
(void)if_idx;
23292336
for (int i = 0; i < WOLFIP_MAX_RAWSOCKETS; i++) {
23302337
struct rawsocket *r = &s->rawsockets[i];

0 commit comments

Comments
 (0)