aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLi Zhijian <lizhijian@fujitsu.com>2025-06-13 16:51:10 +0800
committerMichael S. Tsirkin <mst@redhat.com>2025-07-14 09:16:40 -0400
commitd7fb5693d9ffbeb9b49c981e1f9774392f1d41e5 (patch)
tree0276d9d1e8631adcfd4a4eecb4ac24264f0d37ae
parent85240876b2f6f9edd72a6f324cac0ee9ee28ab0a (diff)
downloadqemu-d7fb5693d9ffbeb9b49c981e1f9774392f1d41e5.zip
qemu-d7fb5693d9ffbeb9b49c981e1f9774392f1d41e5.tar.gz
qemu-d7fb5693d9ffbeb9b49c981e1f9774392f1d41e5.tar.bz2
hw/acpi: Fix GPtrArray memory leak in crs_range_merge
This leak was detected by the valgrind. The crs_range_merge() function unconditionally allocated a GPtrArray 'even when range->len was zero, causing an early return without freeing the allocated array. This resulted in a memory leak when an empty range was processed. Instead of moving the allocation after the check (as previously attempted), use g_autoptr for automatic cleanup. This ensures the array is freed even on early returns, and also removes the need for the explicit free at the end of the function. Signed-off-by: Li Zhijian <lizhijian@fujitsu.com> Message-Id: <20250613085110.111204-1-lizhijian@fujitsu.com> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> Reviewed-by: Ani Sinha <anisinha@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
-rw-r--r--hw/acpi/aml-build.c3
1 files changed, 1 insertions, 2 deletions
diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c
index f8f93a9..cb817a0 100644
--- a/hw/acpi/aml-build.c
+++ b/hw/acpi/aml-build.c
@@ -160,7 +160,7 @@ void crs_replace_with_free_ranges(GPtrArray *ranges,
*/
static void crs_range_merge(GPtrArray *range)
{
- GPtrArray *tmp = g_ptr_array_new_with_free_func(crs_range_free);
+ g_autoptr(GPtrArray) tmp = g_ptr_array_new_with_free_func(crs_range_free);
CrsRangeEntry *entry;
uint64_t range_base, range_limit;
int i;
@@ -191,7 +191,6 @@ static void crs_range_merge(GPtrArray *range)
entry = g_ptr_array_index(tmp, i);
crs_range_insert(range, entry->base, entry->limit);
}
- g_ptr_array_free(tmp, true);
}
static void