From 539c430205d7ced7c63cbfb9093875c3972ff6e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Caruso?= <niccolo.caruso@skywarder.eu> Date: Tue, 6 May 2025 15:56:03 +0000 Subject: [PATCH] [Wiz5500] Fix recvfrom failure when received data exceeds buffer length `recvfrom` incorrectly returned an error when the received data length was greater than the user-provided buffer, even though the read was valid. It now returns the requested amount and leaves the remaining data for future reads. --- src/shared/drivers/WIZ5500/WIZ5500.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/shared/drivers/WIZ5500/WIZ5500.cpp b/src/shared/drivers/WIZ5500/WIZ5500.cpp index 4f0159743..a76456683 100644 --- a/src/shared/drivers/WIZ5500/WIZ5500.cpp +++ b/src/shared/drivers/WIZ5500/WIZ5500.cpp @@ -27,6 +27,8 @@ #include <kernel/scheduler/scheduler.h> #include <utils/KernelTime.h> +#include <algorithm> + #include "WIZ5500Defs.h" using namespace Boardcore; @@ -378,18 +380,19 @@ ssize_t Wiz5500::recvfrom(int sock_n, uint8_t* data, size_t len, WizIp& dst_ip, // Remove what we have already read. recv_len -= sizeof(WizIp) + sizeof(uint16_t) + sizeof(uint16_t); - // Check if we actually have space - if (recv_len < len) - spiRead(Wiz::getSocketRxBlock(sock_n), addr, data, recv_len); + // Read up to the user-provided size, or all received data if smaller + uint16_t read_len = std::min(static_cast<size_t>(recv_len), len); - addr += recv_len; + spiRead(Wiz::getSocketRxBlock(sock_n), addr, data, read_len); + + addr += read_len; spiWrite16(Wiz::getSocketRegBlock(sock_n), Wiz::Socket::REG_RX_RD, addr); // Finally tell the device that we correctly received and read the data spiWrite8(Wiz::getSocketRegBlock(sock_n), Wiz::Socket::REG_CR, Wiz::Socket::CMD_RECV); - return recv_len < len ? recv_len : -1; + return read_len; } void Wiz5500::close(int sock_n, int timeout) -- GitLab