diff options
| author | Christian Brauner <brauner@kernel.org> | 2026-08-20 01:09:21 +0200 |
|---|---|---|
| committer | Christian Brauner <brauner@kernel.org> | 2026-08-31 11:04:49 +0200 |
| commit | 6e9d372171f73696257cbae544f9fd21746f0cf9 (patch) | |
| tree | c17e9229219ca268f187d0faf2c697ae474d30ae /tools | |
| parent | 85e642f9927c9fd0ab3a802a38155b91f2c589ca (diff) | |
| download | linux-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.c | 8 |
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); |
