Skip to content

Commit fa22a37

Browse files
committed
Address review comments, fix bugs, add tests
- ioctl(): read vararg as void* to avoid UB when callers pass pointers - bsd_socket.c: fix errno assignments to use -ret (positive) per POSIX - bsd_socket.c: use -WOLFIP_EAGAIN instead of -EAGAIN in recvfrom - wolfip.c: fix packet socket TX filter loop to pop head on reject instead of advancing via fifo_next() (queue corruption fix) - wolfip.c: return -WOLFIP_EMSGSIZE on buffer-too-small in recvfrom for raw, packet, and ICMP socket paths - wolfip.c: packet setsockopt now rejects unsupported options with -WOLFIP_EINVAL instead of silently succeeding - wolfip.c: getsockopt RECVTTL returns enabled state (1/0), not TTL - wolfip.c: arp_lookup_ex returns -WOLFIP_ENOENT on miss - wolfip.h: add WOLFIP_EMSGSIZE and WOLFIP_ENOENT error codes - wolfip.c: fix IS_IP_BCAST -> wolfIP_ip_is_broadcast() after rebase - Add 7 new unit tests covering EMSGSIZE paths, setsockopt rejection, raw socket options, getsockopt behavior, packet TX via poll, and arp_lookup_ex error codes - Update existing tests to match new error return values
1 parent 3b5aa5d commit fa22a37

6 files changed

Lines changed: 331 additions & 25 deletions

File tree

src/port/posix/bsd_socket.c

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1237,24 +1237,22 @@ int wolfIP_sock_select(struct wolfIP *ipstack, int nfds, fd_set *readfds, fd_set
12371237
int ioctl(int fd, unsigned long request, ...)
12381238
{
12391239
va_list ap;
1240-
uintptr_t arg;
12411240
void *argp;
12421241
struct ifreq *ifr;
12431242
int i;
12441243

12451244
va_start(ap, request);
1246-
arg = va_arg(ap, uintptr_t);
1245+
argp = va_arg(ap, void *);
12471246
va_end(ap);
1248-
argp = (void *)arg;
12491247

12501248
if (in_the_stack) {
1251-
return host_ioctl ? host_ioctl(fd, request, arg) : -1;
1249+
return host_ioctl ? host_ioctl(fd, request, argp) : -1;
12521250
}
12531251

12541252
if (request == SIOCGIFINDEX || request == SIOCGIFHWADDR || request == SIOCGIFADDR) {
12551253
struct wolfip_fd_entry *entry = wolfip_entry_from_public(fd);
12561254
if (!entry) {
1257-
return host_ioctl ? host_ioctl(fd, request, arg) : -1;
1255+
return host_ioctl ? host_ioctl(fd, request, argp) : -1;
12581256
}
12591257
ifr = (struct ifreq *)argp;
12601258
if (!ifr) {
@@ -1330,7 +1328,7 @@ int ioctl(int fd, unsigned long request, ...)
13301328
return 0;
13311329
}
13321330

1333-
return host_ioctl ? host_ioctl(fd, request, arg) : -1;
1331+
return host_ioctl ? host_ioctl(fd, request, argp) : -1;
13341332
}
13351333

13361334
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout) {
@@ -1402,7 +1400,7 @@ int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen) {
14021400
(const struct wolfIP_sockaddr *)addr, addrlen);
14031401
}
14041402
if (ret < 0) {
1405-
errno = ret;
1403+
errno = -ret;
14061404
pthread_mutex_unlock(&wolfIP_mutex);
14071405
return -1;
14081406
}
@@ -1445,7 +1443,7 @@ int close(int sockfd) {
14451443
wolfip_fd_release(sockfd);
14461444
ret = wolfIP_sock_close(IPSTACK, internal_fd);
14471445
if (ret < 0) {
1448-
errno = ret;
1446+
errno = -ret;
14491447
pthread_mutex_unlock(&wolfIP_mutex);
14501448
return -1;
14511449
}
@@ -1502,7 +1500,7 @@ static int wolfip_accept_common(int sockfd, struct sockaddr *addr, socklen_t *ad
15021500
}
15031501
} while (internal_ret == -EAGAIN);
15041502
if (internal_ret < 0) {
1505-
errno = internal_ret;
1503+
errno = -internal_ret;
15061504
pthread_mutex_unlock(&wolfIP_mutex);
15071505
return -1;
15081506
}
@@ -1556,7 +1554,7 @@ ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *
15561554
pthread_mutex_unlock(&wolfIP_mutex);
15571555
return ret;
15581556
}
1559-
if (ret != -EAGAIN)
1557+
if (ret != -WOLFIP_EAGAIN)
15601558
break;
15611559
if (nonblock) {
15621560
errno = EAGAIN;
@@ -1577,7 +1575,7 @@ ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *
15771575
pthread_mutex_lock(&wolfIP_mutex);
15781576
}
15791577
} while (1);
1580-
errno = ret;
1578+
errno = -ret;
15811579
pthread_mutex_unlock(&wolfIP_mutex);
15821580
return -1;
15831581
} else {

src/test/unit/unit.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -708,6 +708,13 @@ Suite *wolf_suite(void)
708708
tcase_add_test(tc_proto, test_udp_short_frame_does_not_overread);
709709
tcase_add_test(tc_proto, test_raw_socket_close_clears_entry);
710710
tcase_add_test(tc_proto, test_packet_socket_close_clears_entry);
711+
tcase_add_test(tc_proto, test_raw_socket_recv_emsgsize);
712+
tcase_add_test(tc_proto, test_packet_socket_recv_emsgsize);
713+
tcase_add_test(tc_proto, test_packet_socket_setsockopt_rejected);
714+
tcase_add_test(tc_proto, test_raw_socket_setsockopt_options);
715+
tcase_add_test(tc_proto, test_raw_socket_getsockopt_recvttl);
716+
tcase_add_test(tc_proto, test_packet_socket_poll_sends_frame);
717+
tcase_add_test(tc_proto, test_arp_lookup_ex_errors);
711718
tcase_add_test(tc_proto, test_arp_lookup_ex_basic);
712719
tcase_add_test(tc_proto, test_wolfip_recv_on_not_for_us);
713720
tcase_add_test(tc_proto, test_wolfip_recv_on_filter_drop_eth);

src/test/unit/unit_tests_dns_dhcp.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1465,7 +1465,7 @@ START_TEST(test_sock_recvfrom_icmp_paths)
14651465
ck_assert_ptr_nonnull(desc);
14661466

14671467
ret = wolfIP_sock_recvfrom(&s, icmp_sd, rxbuf, (size_t)(ICMP_HEADER_LEN - 1), 0, NULL, NULL);
1468-
ck_assert_int_eq(ret, -1);
1468+
ck_assert_int_eq(ret, -WOLFIP_EMSGSIZE);
14691469

14701470
ret = wolfIP_sock_recvfrom(&s, icmp_sd, rxbuf, sizeof(rxbuf), 0, NULL, NULL);
14711471
ck_assert_int_eq(ret, -WOLFIP_EAGAIN);
@@ -1690,7 +1690,7 @@ START_TEST(test_sock_recvfrom_icmp_payload_too_long)
16901690
fifo_push(&ts->sock.udp.rxbuf, &icmp, sizeof(icmp));
16911691

16921692
ret = wolfIP_sock_recvfrom(&s, icmp_sd, rxbuf, sizeof(rxbuf), 0, NULL, NULL);
1693-
ck_assert_int_eq(ret, -1);
1693+
ck_assert_int_eq(ret, -WOLFIP_EMSGSIZE);
16941694
}
16951695
END_TEST
16961696

0 commit comments

Comments
 (0)