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...
Its 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")
Signed-off-by: Christian Brauner (Amutable) <[email protected]>
---
tools/testing/selftests/coredump/coredump_test_helpers.c | 8 ++++----
1 file 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);
--
2.53.0