[PATCH net-next 2/4] vsock/test: Add test for accept_queue memory leak
From: Michal Luczaj <hidden>
Date: 2024-12-06 18:36:00
Subsystem:
the rest, vm sockets (af_vsock) · Maintainers:
Linus Torvalds, Stefano Garzarella
Attempt to enqueue a child after the queue was flushed, but before
SOCK_DONE flag has been set.
Fixed by commit d7b0ff5a8667 ("virtio/vsock: Fix accept_queue memory
leak").
Signed-off-by: Michal Luczaj <redacted>
---
tools/testing/vsock/vsock_test.c | 44 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 44 insertions(+)
diff --git a/tools/testing/vsock/vsock_test.c b/tools/testing/vsock/vsock_test.c
index 38fd8d96eb83ef1bd45728cfaac6adb3c1e07cfe..48b6d970bcfa95f957facb7ba2e729a32d256b4a 100644
--- a/tools/testing/vsock/vsock_test.c
+++ b/tools/testing/vsock/vsock_test.c@@ -1474,6 +1474,45 @@ static void test_stream_cred_upd_on_set_rcvlowat(const struct test_opts *opts) test_stream_credit_update_test(opts, false); } +#define ACCEPTQ_LEAK_RACE_TIMEOUT 2 /* seconds */ + +static void test_stream_leak_acceptq_client(const struct test_opts *opts) +{ + struct sockaddr_vm addr = { + .svm_family = AF_VSOCK, + .svm_port = opts->peer_port, + .svm_cid = opts->peer_cid + }; + time_t tout; + int fd; + + tout = current_nsec() + ACCEPTQ_LEAK_RACE_TIMEOUT * NSEC_PER_SEC; + do { + control_writeulong(1); + + fd = socket(AF_VSOCK, SOCK_STREAM, 0); + if (fd < 0) { + perror("socket"); + exit(EXIT_FAILURE); + } + + connect(fd, (struct sockaddr *)&addr, sizeof(addr)); + close(fd); + } while (current_nsec() < tout); + + control_writeulong(0); +} + +static void test_stream_leak_acceptq_server(const struct test_opts *opts) +{ + int fd; + + while (control_readulong()) { + fd = vsock_stream_listen(VMADDR_CID_ANY, opts->peer_port); + close(fd); + } +} + static struct test_case test_cases[] = { { .name = "SOCK_STREAM connection reset",
@@ -1604,6 +1643,11 @@ static struct test_case test_cases[] = { .run_client = test_seqpacket_unsent_bytes_client, .run_server = test_seqpacket_unsent_bytes_server, }, + { + .name = "SOCK_STREAM leak accept queue", + .run_client = test_stream_leak_acceptq_client, + .run_server = test_stream_leak_acceptq_server, + }, {}, };
--
2.47.1