mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
tests/ncdevmem: Fix double-free of queue array
netdev_bind_rx takes ownership of the queue array passed as parameter
and frees it, so a queue array buffer cannot be reused across multiple
netdev_bind_rx calls.
This commit fixes that by always passing in a newly created queue array
to all netdev_bind_rx calls in ncdevmem.
Fixes: 85585b4bc8
("selftests: add ncdevmem, netcat for devmem TCP")
Signed-off-by: Cosmin Ratiu <cratiu@nvidia.com>
Acked-by: Stanislav Fomichev <sdf@fomichev.me>
Reviewed-by: Joe Damato <jdamato@fastly.com>
Reviewed-by: Mina Almasry <almasrymina@google.com>
Link: https://patch.msgid.link/20250508084434.1933069-1-cratiu@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
f11cf946c0
commit
97c4e094a4
1 changed files with 22 additions and 33 deletions
|
@ -431,6 +431,22 @@ static int parse_address(const char *str, int port, struct sockaddr_in6 *sin6)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct netdev_queue_id *create_queues(void)
|
||||||
|
{
|
||||||
|
struct netdev_queue_id *queues;
|
||||||
|
size_t i = 0;
|
||||||
|
|
||||||
|
queues = calloc(num_queues, sizeof(*queues));
|
||||||
|
for (i = 0; i < num_queues; i++) {
|
||||||
|
queues[i]._present.type = 1;
|
||||||
|
queues[i]._present.id = 1;
|
||||||
|
queues[i].type = NETDEV_QUEUE_TYPE_RX;
|
||||||
|
queues[i].id = start_queue + i;
|
||||||
|
}
|
||||||
|
|
||||||
|
return queues;
|
||||||
|
}
|
||||||
|
|
||||||
int do_server(struct memory_buffer *mem)
|
int do_server(struct memory_buffer *mem)
|
||||||
{
|
{
|
||||||
char ctrl_data[sizeof(int) * 20000];
|
char ctrl_data[sizeof(int) * 20000];
|
||||||
|
@ -448,7 +464,6 @@ int do_server(struct memory_buffer *mem)
|
||||||
char buffer[256];
|
char buffer[256];
|
||||||
int socket_fd;
|
int socket_fd;
|
||||||
int client_fd;
|
int client_fd;
|
||||||
size_t i = 0;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = parse_address(server_ip, atoi(port), &server_sin);
|
ret = parse_address(server_ip, atoi(port), &server_sin);
|
||||||
|
@ -471,16 +486,7 @@ int do_server(struct memory_buffer *mem)
|
||||||
|
|
||||||
sleep(1);
|
sleep(1);
|
||||||
|
|
||||||
queues = malloc(sizeof(*queues) * num_queues);
|
if (bind_rx_queue(ifindex, mem->fd, create_queues(), num_queues, &ys))
|
||||||
|
|
||||||
for (i = 0; i < num_queues; i++) {
|
|
||||||
queues[i]._present.type = 1;
|
|
||||||
queues[i]._present.id = 1;
|
|
||||||
queues[i].type = NETDEV_QUEUE_TYPE_RX;
|
|
||||||
queues[i].id = start_queue + i;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bind_rx_queue(ifindex, mem->fd, queues, num_queues, &ys))
|
|
||||||
error(1, 0, "Failed to bind\n");
|
error(1, 0, "Failed to bind\n");
|
||||||
|
|
||||||
tmp_mem = malloc(mem->size);
|
tmp_mem = malloc(mem->size);
|
||||||
|
@ -545,7 +551,6 @@ int do_server(struct memory_buffer *mem)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
i++;
|
|
||||||
for (cm = CMSG_FIRSTHDR(&msg); cm; cm = CMSG_NXTHDR(&msg, cm)) {
|
for (cm = CMSG_FIRSTHDR(&msg); cm; cm = CMSG_NXTHDR(&msg, cm)) {
|
||||||
if (cm->cmsg_level != SOL_SOCKET ||
|
if (cm->cmsg_level != SOL_SOCKET ||
|
||||||
(cm->cmsg_type != SCM_DEVMEM_DMABUF &&
|
(cm->cmsg_type != SCM_DEVMEM_DMABUF &&
|
||||||
|
@ -630,10 +635,8 @@ cleanup:
|
||||||
|
|
||||||
void run_devmem_tests(void)
|
void run_devmem_tests(void)
|
||||||
{
|
{
|
||||||
struct netdev_queue_id *queues;
|
|
||||||
struct memory_buffer *mem;
|
struct memory_buffer *mem;
|
||||||
struct ynl_sock *ys;
|
struct ynl_sock *ys;
|
||||||
size_t i = 0;
|
|
||||||
|
|
||||||
mem = provider->alloc(getpagesize() * NUM_PAGES);
|
mem = provider->alloc(getpagesize() * NUM_PAGES);
|
||||||
|
|
||||||
|
@ -641,38 +644,24 @@ void run_devmem_tests(void)
|
||||||
if (configure_rss())
|
if (configure_rss())
|
||||||
error(1, 0, "rss error\n");
|
error(1, 0, "rss error\n");
|
||||||
|
|
||||||
queues = calloc(num_queues, sizeof(*queues));
|
|
||||||
|
|
||||||
if (configure_headersplit(1))
|
if (configure_headersplit(1))
|
||||||
error(1, 0, "Failed to configure header split\n");
|
error(1, 0, "Failed to configure header split\n");
|
||||||
|
|
||||||
if (!bind_rx_queue(ifindex, mem->fd, queues, num_queues, &ys))
|
if (!bind_rx_queue(ifindex, mem->fd,
|
||||||
|
calloc(num_queues, sizeof(struct netdev_queue_id)),
|
||||||
|
num_queues, &ys))
|
||||||
error(1, 0, "Binding empty queues array should have failed\n");
|
error(1, 0, "Binding empty queues array should have failed\n");
|
||||||
|
|
||||||
for (i = 0; i < num_queues; i++) {
|
|
||||||
queues[i]._present.type = 1;
|
|
||||||
queues[i]._present.id = 1;
|
|
||||||
queues[i].type = NETDEV_QUEUE_TYPE_RX;
|
|
||||||
queues[i].id = start_queue + i;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (configure_headersplit(0))
|
if (configure_headersplit(0))
|
||||||
error(1, 0, "Failed to configure header split\n");
|
error(1, 0, "Failed to configure header split\n");
|
||||||
|
|
||||||
if (!bind_rx_queue(ifindex, mem->fd, queues, num_queues, &ys))
|
if (!bind_rx_queue(ifindex, mem->fd, create_queues(), num_queues, &ys))
|
||||||
error(1, 0, "Configure dmabuf with header split off should have failed\n");
|
error(1, 0, "Configure dmabuf with header split off should have failed\n");
|
||||||
|
|
||||||
if (configure_headersplit(1))
|
if (configure_headersplit(1))
|
||||||
error(1, 0, "Failed to configure header split\n");
|
error(1, 0, "Failed to configure header split\n");
|
||||||
|
|
||||||
for (i = 0; i < num_queues; i++) {
|
if (bind_rx_queue(ifindex, mem->fd, create_queues(), num_queues, &ys))
|
||||||
queues[i]._present.type = 1;
|
|
||||||
queues[i]._present.id = 1;
|
|
||||||
queues[i].type = NETDEV_QUEUE_TYPE_RX;
|
|
||||||
queues[i].id = start_queue + i;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bind_rx_queue(ifindex, mem->fd, queues, num_queues, &ys))
|
|
||||||
error(1, 0, "Failed to bind\n");
|
error(1, 0, "Failed to bind\n");
|
||||||
|
|
||||||
/* Deactivating a bound queue should not be legal */
|
/* Deactivating a bound queue should not be legal */
|
||||||
|
|
Loading…
Add table
Reference in a new issue