vfio/mlx5: Fix an unwind issue in mlx5vf_add_migration_pages()
BugLink: https://bugs.launchpad.net/bugs/2101915
[ Upstream commit 22e87bf3f77c18f5982c19ffe2732ef0c7a25f16 ]
Fix an unwind issue in mlx5vf_add_migration_pages().
If a set of pages is allocated but fails to be added to the SG table,
they need to be freed to prevent a memory leak.
Any pages successfully added to the SG table will be freed as part of
mlx5vf_free_data_buffer().
Fixes: 6fadb02126 ("vfio/mlx5: Implement vfio_pci driver for mlx5 devices")
Signed-off-by: Yishai Hadas <yishaih@nvidia.com>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Link: https://lore.kernel.org/r/20241114095318.16556-2-yishaih@nvidia.com
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
[koichiroden: applied to an older path due to missing commit:
821b8f6bf848 ("vfio/mlx5: Enforce PRE_COPY support")]
CVE-2024-56742
Signed-off-by: Koichiro Den <koichiro.den@canonical.com>
Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
This commit is contained in:
committed by
Stefan Bader
parent
ead7ecbeaf
commit
d9f1683b6c
@@ -73,6 +73,7 @@ int mlx5vf_add_migration_pages(struct mlx5_vhca_data_buffer *buf,
|
||||
unsigned long filled;
|
||||
unsigned int to_fill;
|
||||
int ret;
|
||||
int i;
|
||||
|
||||
to_fill = min_t(unsigned int, npages, PAGE_SIZE / sizeof(*page_list));
|
||||
page_list = kvzalloc(to_fill * sizeof(*page_list), GFP_KERNEL_ACCOUNT);
|
||||
@@ -93,7 +94,7 @@ int mlx5vf_add_migration_pages(struct mlx5_vhca_data_buffer *buf,
|
||||
GFP_KERNEL_ACCOUNT);
|
||||
|
||||
if (ret)
|
||||
goto err;
|
||||
goto err_append;
|
||||
buf->allocated_length += filled * PAGE_SIZE;
|
||||
/* clean input for another bulk allocation */
|
||||
memset(page_list, 0, filled * sizeof(*page_list));
|
||||
@@ -104,6 +105,9 @@ int mlx5vf_add_migration_pages(struct mlx5_vhca_data_buffer *buf,
|
||||
kvfree(page_list);
|
||||
return 0;
|
||||
|
||||
err_append:
|
||||
for (i = filled - 1; i >= 0; i--)
|
||||
__free_page(page_list[i]);
|
||||
err:
|
||||
kvfree(page_list);
|
||||
return ret;
|
||||
|
||||
Reference in New Issue
Block a user