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


Reply via email to