summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorChristian Brauner <brauner@kernel.org>2026-08-20 01:09:21 +0200
committerChristian Brauner <brauner@kernel.org>2026-08-31 11:04:49 +0200
commit6e9d372171f73696257cbae544f9fd21746f0cf9 (patch)
treec17e9229219ca268f187d0faf2c697ae474d30ae /tools
parent85e642f9927c9fd0ab3a802a38155b91f2c589ca (diff)
downloadlinux-next-6e9d372171f73696257cbae544f9fd21746f0cf9.tar.gz
linux-next-6e9d372171f73696257cbae544f9fd21746f0cf9.zip
selftests/coredump: discard the right amount after the coredump request
read_coredump_req() gets the leftover wrong twice. It takes the absolute difference of the two sizes, so a test binary that knows a larger struct coredump_req than the kernel sends tries to discard bytes that were never sent. And it hands recv() sizeof(buffer) instead of the number of bytes it wants. So MSG_WAITALL waits for a whole page. Either one blocks until the kernel closes the socket. Which it won't because it is waiting for the coredump ack... It's benign today because struct coredump_req hasn't grown. But let's fix it for the future. Compute the leftover as what the kernel sent beyond what was consumed. Fixes: 59cd658eaf40 ("selftests/coredump: add coredump server selftests") Link: https://patch.msgid.link/20260820-work-coredump-sparse-v2-4-ba32dd718c51@kernel.org Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
Diffstat (limited to 'tools')
-rw-r--r--tools/testing/selftests/coredump/coredump_test_helpers.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/tools/testing/selftests/coredump/coredump_test_helpers.c b/tools/testing/selftests/coredump/coredump_test_helpers.c
index 2a20faf9cb0a..524fa5370593 100644
--- a/tools/testing/selftests/coredump/coredump_test_helpers.c
+++ b/tools/testing/selftests/coredump/coredump_test_helpers.c
@@ -235,10 +235,10 @@ bool read_coredump_req(int fd, struct coredump_req *req)
fprintf(stderr, "Read coredump request with size %u and mask 0x%llx\n",
req->size, (unsigned long long)req->mask);
- if (user_size > kernel_size)
- remaining_size = user_size - kernel_size;
- else
+ if (kernel_size > user_size)
remaining_size = kernel_size - user_size;
+ else
+ remaining_size = 0;
if (PAGE_SIZE <= remaining_size)
return false;
@@ -250,7 +250,7 @@ bool read_coredump_req(int fd, struct coredump_req *req)
if (remaining_size) {
char buffer[PAGE_SIZE];
- ret = recv(fd, buffer, sizeof(buffer), MSG_WAITALL);
+ ret = recv(fd, buffer, remaining_size, MSG_WAITALL);
if (ret != remaining_size)
return false;
fprintf(stderr, "Discarded %zu bytes of data after coredump request\n", remaining_size);