public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH net] vsock/test: fix send_buf()/recv_buf() EINTR handling
@ 2026-04-03  9:32 Stefano Garzarella
  2026-04-03 12:10 ` Luigi Leonardi
  2026-04-07  1:50 ` patchwork-bot+netdevbpf
  0 siblings, 2 replies; 3+ messages in thread
From: Stefano Garzarella @ 2026-04-03  9:32 UTC (permalink / raw)
  To: netdev
  Cc: David S. Miller, Arseniy Krasnov, linux-kernel,
	Stefano Garzarella, virtualization

From: Stefano Garzarella <sgarzare@redhat.com>

When send() or recv() returns -1 with errno == EINTR, the code skips
the break but still adds the return value to nwritten/nread, making it
decrease by 1. This leads to wrong buffer offsets and wrong bytes count.

Fix it by explicitly continuing the loop on EINTR, so the return value
is only added when it is positive.

Fixes: a8ed71a27ef5 ("vsock/test: add recv_buf() utility function")
Fixes: 12329bd51fdc ("vsock/test: add send_buf() utility function")
Signed-off-by: Stefano Garzarella <sgarzare@redhat.com>
---
 tools/testing/vsock/util.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/tools/testing/vsock/util.c b/tools/testing/vsock/util.c
index 9430ef5b8bc3..1fe1338c79cd 100644
--- a/tools/testing/vsock/util.c
+++ b/tools/testing/vsock/util.c
@@ -344,7 +344,9 @@ void send_buf(int fd, const void *buf, size_t len, int flags,
 		ret = send(fd, buf + nwritten, len - nwritten, flags);
 		timeout_check("send");
 
-		if (ret == 0 || (ret < 0 && errno != EINTR))
+		if (ret < 0 && errno == EINTR)
+			continue;
+		if (ret <= 0)
 			break;
 
 		nwritten += ret;
@@ -396,7 +398,9 @@ void recv_buf(int fd, void *buf, size_t len, int flags, ssize_t expected_ret)
 		ret = recv(fd, buf + nread, len - nread, flags);
 		timeout_check("recv");
 
-		if (ret == 0 || (ret < 0 && errno != EINTR))
+		if (ret < 0 && errno == EINTR)
+			continue;
+		if (ret <= 0)
 			break;
 
 		nread += ret;
-- 
2.53.0


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH net] vsock/test: fix send_buf()/recv_buf() EINTR handling
  2026-04-03  9:32 [PATCH net] vsock/test: fix send_buf()/recv_buf() EINTR handling Stefano Garzarella
@ 2026-04-03 12:10 ` Luigi Leonardi
  2026-04-07  1:50 ` patchwork-bot+netdevbpf
  1 sibling, 0 replies; 3+ messages in thread
From: Luigi Leonardi @ 2026-04-03 12:10 UTC (permalink / raw)
  To: Stefano Garzarella
  Cc: netdev, David S. Miller, Arseniy Krasnov, linux-kernel,
	virtualization

On Fri, Apr 03, 2026 at 11:32:51AM +0200, Stefano Garzarella wrote:
>From: Stefano Garzarella <sgarzare@redhat.com>
>
>When send() or recv() returns -1 with errno == EINTR, the code skips
>the break but still adds the return value to nwritten/nread, making it
>decrease by 1. This leads to wrong buffer offsets and wrong bytes count.
>
>Fix it by explicitly continuing the loop on EINTR, so the return value
>is only added when it is positive.
>
>Fixes: a8ed71a27ef5 ("vsock/test: add recv_buf() utility function")
>Fixes: 12329bd51fdc ("vsock/test: add send_buf() utility function")
>Signed-off-by: Stefano Garzarella <sgarzare@redhat.com>
>---
> tools/testing/vsock/util.c | 8 ++++++--
> 1 file changed, 6 insertions(+), 2 deletions(-)
>
>diff --git a/tools/testing/vsock/util.c b/tools/testing/vsock/util.c
>index 9430ef5b8bc3..1fe1338c79cd 100644
>--- a/tools/testing/vsock/util.c
>+++ b/tools/testing/vsock/util.c
>@@ -344,7 +344,9 @@ void send_buf(int fd, const void *buf, size_t len, int flags,
> 		ret = send(fd, buf + nwritten, len - nwritten, flags);
> 		timeout_check("send");
>
>-		if (ret == 0 || (ret < 0 && errno != EINTR))
>+		if (ret < 0 && errno == EINTR)
>+			continue;
>+		if (ret <= 0)
> 			break;
>
> 		nwritten += ret;
>@@ -396,7 +398,9 @@ void recv_buf(int fd, void *buf, size_t len, int flags, ssize_t expected_ret)
> 		ret = recv(fd, buf + nread, len - nread, flags);
> 		timeout_check("recv");
>
>-		if (ret == 0 || (ret < 0 && errno != EINTR))
>+		if (ret < 0 && errno == EINTR)
>+			continue;
>+		if (ret <= 0)
> 			break;
>
> 		nread += ret;
>-- 
>2.53.0
>

LGTM!

Reviewed-by: Luigi Leonardi <leonardi@redhat.com>


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH net] vsock/test: fix send_buf()/recv_buf() EINTR handling
  2026-04-03  9:32 [PATCH net] vsock/test: fix send_buf()/recv_buf() EINTR handling Stefano Garzarella
  2026-04-03 12:10 ` Luigi Leonardi
@ 2026-04-07  1:50 ` patchwork-bot+netdevbpf
  1 sibling, 0 replies; 3+ messages in thread
From: patchwork-bot+netdevbpf @ 2026-04-07  1:50 UTC (permalink / raw)
  To: Stefano Garzarella; +Cc: netdev, davem, avkrasnov, linux-kernel, virtualization

Hello:

This patch was applied to netdev/net.git (main)
by Jakub Kicinski <kuba@kernel.org>:

On Fri,  3 Apr 2026 11:32:51 +0200 you wrote:
> From: Stefano Garzarella <sgarzare@redhat.com>
> 
> When send() or recv() returns -1 with errno == EINTR, the code skips
> the break but still adds the return value to nwritten/nread, making it
> decrease by 1. This leads to wrong buffer offsets and wrong bytes count.
> 
> Fix it by explicitly continuing the loop on EINTR, so the return value
> is only added when it is positive.
> 
> [...]

Here is the summary with links:
  - [net] vsock/test: fix send_buf()/recv_buf() EINTR handling
    https://git.kernel.org/netdev/net/c/24ad7ff66889

You are awesome, thank you!
-- 
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html



^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2026-04-07  1:50 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-03  9:32 [PATCH net] vsock/test: fix send_buf()/recv_buf() EINTR handling Stefano Garzarella
2026-04-03 12:10 ` Luigi Leonardi
2026-04-07  1:50 ` patchwork-bot+netdevbpf

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox