Skip to content

Commit 9072f31

Browse files
committed
Addressed more copilot review comments
1 parent 5d7f141 commit 9072f31

3 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>
@@ -1230,13 +1231,13 @@ int wolfIP_sock_select(struct wolfIP *ipstack, int nfds, fd_set *readfds, fd_set
12301231
int ioctl(int fd, unsigned long request, ...)
12311232
{
12321233
va_list ap;
1233-
unsigned long arg;
1234+
uintptr_t arg;
12341235
void *argp;
12351236
struct ifreq *ifr;
12361237
int i;
12371238

12381239
va_start(ap, request);
1239-
arg = va_arg(ap, unsigned long);
1240+
arg = va_arg(ap, uintptr_t);
12401241
va_end(ap);
12411242
argp = (void *)arg;
12421243

src/test/unit/unit.c

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1109,6 +1109,50 @@ START_TEST(test_raw_socket_recv_too_short_drop_returns_einval)
11091109
}
11101110
END_TEST
11111111

1112+
START_TEST(test_raw_socket_recv_uses_ip_total_length)
1113+
{
1114+
struct wolfIP s;
1115+
int sd;
1116+
uint8_t frame_buf[ETH_HEADER_LEN + IP_HEADER_LEN + 6];
1117+
struct wolfIP_ip_packet *frame = (struct wolfIP_ip_packet *)frame_buf;
1118+
uint8_t payload[2] = {0xAB, 0xCD};
1119+
uint8_t padding[4] = {0x99, 0x98, 0x97, 0x96};
1120+
uint8_t rxbuf[64];
1121+
int ret;
1122+
1123+
wolfIP_init(&s);
1124+
mock_link_init(&s);
1125+
wolfIP_ipconfig_set(&s, 0x0A000001U, 0xFFFFFF00U, 0);
1126+
1127+
sd = wolfIP_sock_socket(&s, AF_INET, IPSTACK_SOCK_RAW, WI_IPPROTO_UDP);
1128+
ck_assert_int_ge(sd, 0);
1129+
1130+
memset(frame, 0, sizeof(frame_buf));
1131+
memcpy(frame->eth.dst, s.ll_dev[TEST_PRIMARY_IF].mac, 6);
1132+
memcpy(frame->eth.src, "\xaa\xbb\xcc\xdd\xee\xff", 6);
1133+
frame->eth.type = ee16(ETH_TYPE_IP);
1134+
frame->ver_ihl = 0x45;
1135+
frame->ttl = 32;
1136+
frame->proto = WI_IPPROTO_UDP;
1137+
frame->len = ee16(IP_HEADER_LEN + sizeof(payload));
1138+
frame->src = ee32(0x0A000002U);
1139+
frame->dst = ee32(0x0A000001U);
1140+
memcpy(frame->data, payload, sizeof(payload));
1141+
memcpy(frame->data + sizeof(payload), padding, sizeof(padding));
1142+
frame->csum = 0;
1143+
iphdr_set_checksum(frame);
1144+
1145+
wolfIP_recv_ex(&s, TEST_PRIMARY_IF, frame,
1146+
ETH_HEADER_LEN + IP_HEADER_LEN + sizeof(payload) + sizeof(padding));
1147+
1148+
memset(rxbuf, 0, sizeof(rxbuf));
1149+
ret = wolfIP_sock_recvfrom(&s, sd, rxbuf, sizeof(rxbuf), 0, NULL, NULL);
1150+
ck_assert_int_eq(ret, (int)(IP_HEADER_LEN + sizeof(payload)));
1151+
ck_assert_mem_eq(rxbuf, ((uint8_t *)frame) + ETH_HEADER_LEN,
1152+
IP_HEADER_LEN + sizeof(payload));
1153+
}
1154+
END_TEST
1155+
11121156
START_TEST(test_udp_short_frame_does_not_overread)
11131157
{
11141158
struct wolfIP s;
@@ -18406,6 +18450,7 @@ Suite *wolf_suite(void)
1840618450
tcase_add_test(tc_proto, test_raw_socket_recv_protocol_mismatch);
1840718451
tcase_add_test(tc_proto, test_raw_socket_recv_short_frame_ignored);
1840818452
tcase_add_test(tc_proto, test_raw_socket_recv_too_short_drop_returns_einval);
18453+
tcase_add_test(tc_proto, test_raw_socket_recv_uses_ip_total_length);
1840918454
tcase_add_test(tc_proto, test_udp_short_frame_does_not_overread);
1841018455
tcase_add_test(tc_proto, test_raw_socket_close_clears_entry);
1841118456
tcase_add_test(tc_proto, test_packet_socket_close_clears_entry);

src/wolfip.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1855,6 +1855,7 @@ static void raw_try_recv(struct wolfIP *s, unsigned int if_idx, struct wolfIP_ip
18551855
{
18561856
uint32_t payload_len = frame_len;
18571857
const uint8_t *packet = (const uint8_t *)ip;
1858+
uint32_t ip_len;
18581859
#ifdef ETHERNET
18591860
if (frame_len <= ETH_HEADER_LEN)
18601861
return;
@@ -1863,6 +1864,12 @@ static void raw_try_recv(struct wolfIP *s, unsigned int if_idx, struct wolfIP_ip
18631864
#endif
18641865
if (payload_len < IP_HEADER_LEN)
18651866
return;
1867+
ip_len = (uint32_t)ee16(ip->len);
1868+
if (ip_len < IP_HEADER_LEN)
1869+
return;
1870+
if (ip_len > payload_len)
1871+
return;
1872+
payload_len = ip_len;
18661873
(void)if_idx;
18671874
for (int i = 0; i < WOLFIP_MAX_RAWSOCKETS; i++) {
18681875
struct rawsocket *r = &s->rawsockets[i];

0 commit comments

Comments
 (0)