fix: zephyr sockets: fix get/set sockopt usages.

In multiple places, setsockopt is used when getsockopt shall be used, and vice-versa.
Additionally, pointer isn't checked correctly in two places, this commit fixes those as well.
Per man(7), most socket-level options utilize an int argument for optval. Use those for ttl.

Signed-off-by: Krisztian Szilvasi <34309983+kr-t@users.noreply.github.com>
This commit is contained in:
Krisztian Szilvasi 2026-02-17 13:02:11 +01:00
parent 0c9fe614ae
commit 6d8a33cda6
No known key found for this signature in database

View File

@ -173,7 +173,7 @@ os_socket_getbooloption(bh_socket_t socket, int level, int optname,
int optval;
socklen_t optval_size = sizeof(optval);
if (zsock_setsockopt(socket->fd, level, optname, &optval, optval_size)
if (zsock_getsockopt(socket->fd, level, optname, &optval, &optval_size)
!= 0) {
return BHT_ERROR;
}
@ -190,7 +190,7 @@ os_socket_create(bh_socket_t *sock, bool is_ipv4, bool is_tcp)
*(sock) = BH_MALLOC(sizeof(zephyr_handle));
if (!sock) {
if (!*sock) {
return BHT_ERROR;
}
@ -262,8 +262,13 @@ os_socket_settimeout(bh_socket_t socket, uint64 timeout_us)
timeout.tv_sec = timeout_us / 1000000;
timeout.tv_usec = timeout_us % 1000000;
return zsock_setsockopt(socket->fd, SOL_SOCKET, SO_RCVTIMEO, &timeout,
sizeof(timeout));
if (zsock_setsockopt(socket->fd, SOL_SOCKET, SO_RCVTIMEO, &timeout,
sizeof(timeout))
!= 0) {
return BHT_ERROR;
}
return BHT_OK;
}
int
@ -277,7 +282,7 @@ os_socket_accept(bh_socket_t server_sock, bh_socket_t *sock, void *addr,
unsigned int *addrlen)
{
*sock = BH_MALLOC(sizeof(zephyr_handle));
if (!sock) {
if (!*sock) {
return BHT_ERROR;
}
@ -609,7 +614,7 @@ os_socket_get_send_timeout(bh_socket_t socket, uint64 *timeout_us)
struct timeval tv;
socklen_t tv_len = sizeof(tv);
if (zsock_setsockopt(socket->fd, SOL_SOCKET, SO_SNDTIMEO, &tv, tv_len)
if (zsock_getsockopt(socket->fd, SOL_SOCKET, SO_SNDTIMEO, &tv, &tv_len)
!= 0) {
return BHT_ERROR;
}
@ -639,7 +644,7 @@ os_socket_get_recv_timeout(bh_socket_t socket, uint64 *timeout_us)
struct timeval tv;
socklen_t tv_len = sizeof(tv);
if (zsock_setsockopt(socket->fd, SOL_SOCKET, SO_RCVTIMEO, &tv, tv_len)
if (zsock_getsockopt(socket->fd, SOL_SOCKET, SO_RCVTIMEO, &tv, &tv_len)
!= 0) {
return BHT_ERROR;
}
@ -760,8 +765,8 @@ os_socket_get_tcp_keep_idle(bh_socket_t socket, uint32_t *time_s)
socklen_t time_s_len = sizeof(time_s_int);
#ifdef TCP_KEEPIDLE
if (zsock_setsockopt(socket->fd, IPPROTO_TCP, TCP_KEEPIDLE, &time_s_int,
time_s_len)
if (zsock_getsockopt(socket->fd, IPPROTO_TCP, TCP_KEEPIDLE, &time_s_int,
&time_s_len)
!= 0) {
return BHT_ERROR;
}
@ -769,8 +774,8 @@ os_socket_get_tcp_keep_idle(bh_socket_t socket, uint32_t *time_s)
return BHT_OK;
#elif defined(TCP_KEEPALIVE)
if (zsock_setsockopt(socket->fd, IPPROTO_TCP, TCP_KEEPALIVE, &time_s_int,
time_s_len)
if (zsock_getsockopt(socket->fd, IPPROTO_TCP, TCP_KEEPALIVE, &time_s_int,
&time_s_len)
!= 0) {
return BHT_ERROR;
}
@ -965,13 +970,13 @@ os_socket_set_ip_ttl(bh_socket_t socket, uint8_t ttl_s)
int
os_socket_get_ip_ttl(bh_socket_t socket, uint8_t *ttl_s)
{
socklen_t opt_len = sizeof(*ttl_s);
if (zsock_setsockopt(socket->fd, IPPROTO_IP, IP_MULTICAST_TTL, ttl_s,
opt_len)
!= 0) {
/* Most socket-level options utilize an int argument for optval */
int opt;
socklen_t opt_len = sizeof(opt);
if (zsock_getsockopt(socket->fd, IPPROTO_IP, IP_TTL, &opt, &opt_len) != 0) {
return BHT_ERROR;
}
*ttl_s = (uint8_t)opt;
return BHT_OK;
}
@ -991,13 +996,15 @@ os_socket_set_ip_multicast_ttl(bh_socket_t socket, uint8_t ttl_s)
int
os_socket_get_ip_multicast_ttl(bh_socket_t socket, uint8_t *ttl_s)
{
socklen_t opt_len = sizeof(*ttl_s);
if (zsock_setsockopt(socket->fd, IPPROTO_IP, IP_MULTICAST_TTL, ttl_s,
opt_len)
/* Most socket-level options utilize an int argument for optval */
int opt;
socklen_t opt_len = sizeof(opt);
if (zsock_getsockopt(socket->fd, IPPROTO_IP, IP_MULTICAST_TTL, &opt,
&opt_len)
!= 0) {
return BHT_ERROR;
}
*ttl_s = (uint8_t)opt;
return BHT_OK;
}
@ -1059,4 +1066,4 @@ int
os_poll(os_poll_file_handle *fds, os_nfds_t nfs, int timeout)
{
return zsock_poll(fds, nfs, timeout);
}
}