Skip to content

Commit 3b5aa5d

Browse files
committed
Addressed more copilot review comments
1 parent bb07c81 commit 3b5aa5d

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
@@ -704,6 +704,7 @@ Suite *wolf_suite(void)
704704
tcase_add_test(tc_proto, test_raw_socket_recv_protocol_mismatch);
705705
tcase_add_test(tc_proto, test_raw_socket_recv_short_frame_ignored);
706706
tcase_add_test(tc_proto, test_raw_socket_recv_too_short_drop_returns_einval);
707+
tcase_add_test(tc_proto, test_raw_socket_recv_uses_ip_total_length);
707708
tcase_add_test(tc_proto, test_udp_short_frame_does_not_overread);
708709
tcase_add_test(tc_proto, test_raw_socket_close_clears_entry);
709710
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
@@ -6165,5 +6165,49 @@ START_TEST(test_raw_socket_recv_too_short_drop_returns_einval)
61656165
}
61666166
END_TEST
61676167

6168+
START_TEST(test_raw_socket_recv_uses_ip_total_length)
6169+
{
6170+
struct wolfIP s;
6171+
int sd;
6172+
uint8_t frame_buf[ETH_HEADER_LEN + IP_HEADER_LEN + 6];
6173+
struct wolfIP_ip_packet *frame = (struct wolfIP_ip_packet *)frame_buf;
6174+
uint8_t payload[2] = {0xAB, 0xCD};
6175+
uint8_t padding[4] = {0x99, 0x98, 0x97, 0x96};
6176+
uint8_t rxbuf[64];
6177+
int ret;
6178+
6179+
wolfIP_init(&s);
6180+
mock_link_init(&s);
6181+
wolfIP_ipconfig_set(&s, 0x0A000001U, 0xFFFFFF00U, 0);
6182+
6183+
sd = wolfIP_sock_socket(&s, AF_INET, IPSTACK_SOCK_RAW, WI_IPPROTO_UDP);
6184+
ck_assert_int_ge(sd, 0);
6185+
6186+
memset(frame, 0, sizeof(frame_buf));
6187+
memcpy(frame->eth.dst, s.ll_dev[TEST_PRIMARY_IF].mac, 6);
6188+
memcpy(frame->eth.src, "\xaa\xbb\xcc\xdd\xee\xff", 6);
6189+
frame->eth.type = ee16(ETH_TYPE_IP);
6190+
frame->ver_ihl = 0x45;
6191+
frame->ttl = 32;
6192+
frame->proto = WI_IPPROTO_UDP;
6193+
frame->len = ee16(IP_HEADER_LEN + sizeof(payload));
6194+
frame->src = ee32(0x0A000002U);
6195+
frame->dst = ee32(0x0A000001U);
6196+
memcpy(frame->data, payload, sizeof(payload));
6197+
memcpy(frame->data + sizeof(payload), padding, sizeof(padding));
6198+
frame->csum = 0;
6199+
iphdr_set_checksum(frame);
6200+
6201+
wolfIP_recv_ex(&s, TEST_PRIMARY_IF, frame,
6202+
ETH_HEADER_LEN + IP_HEADER_LEN + sizeof(payload) + sizeof(padding));
6203+
6204+
memset(rxbuf, 0, sizeof(rxbuf));
6205+
ret = wolfIP_sock_recvfrom(&s, sd, rxbuf, sizeof(rxbuf), 0, NULL, NULL);
6206+
ck_assert_int_eq(ret, (int)(IP_HEADER_LEN + sizeof(payload)));
6207+
ck_assert_mem_eq(rxbuf, ((uint8_t *)frame) + ETH_HEADER_LEN,
6208+
IP_HEADER_LEN + sizeof(payload));
6209+
}
6210+
END_TEST
6211+
61686212

61696213
/* ----------------------------------------------------------------------- */

src/wolfip.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2235,6 +2235,7 @@ static void raw_try_recv(struct wolfIP *s, unsigned int if_idx, struct wolfIP_ip
22352235
{
22362236
uint32_t payload_len = frame_len;
22372237
const uint8_t *packet = (const uint8_t *)ip;
2238+
uint32_t ip_len;
22382239
#ifdef ETHERNET
22392240
if (frame_len <= ETH_HEADER_LEN)
22402241
return;
@@ -2243,6 +2244,12 @@ static void raw_try_recv(struct wolfIP *s, unsigned int if_idx, struct wolfIP_ip
22432244
#endif
22442245
if (payload_len < IP_HEADER_LEN)
22452246
return;
2247+
ip_len = (uint32_t)ee16(ip->len);
2248+
if (ip_len < IP_HEADER_LEN)
2249+
return;
2250+
if (ip_len > payload_len)
2251+
return;
2252+
payload_len = ip_len;
22462253
(void)if_idx;
22472254
for (int i = 0; i < WOLFIP_MAX_RAWSOCKETS; i++) {
22482255
struct rawsocket *r = &s->rawsockets[i];

0 commit comments

Comments
 (0)