From e9052f56eeb924971e44a9d49ad1aaa0394dc9ff Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Fri, 12 Jul 2013 20:37:55 -0700 Subject: [PATCH] sparse-xarray: Fix memory leak in dump_sparse_xarray_to_disk(). Bug #39070. --- src/libpspp/sparse-xarray.c | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/src/libpspp/sparse-xarray.c b/src/libpspp/sparse-xarray.c index 0cc91c63cd..5168d87922 100644 --- a/src/libpspp/sparse-xarray.c +++ b/src/libpspp/sparse-xarray.c @@ -134,6 +134,21 @@ sparse_xarray_clone (const struct sparse_xarray *old) return new; } +static void +free_memory_rows (struct sparse_xarray *sx) +{ + if (sx->memory != NULL) + { + unsigned long int idx; + uint8_t **row; + for (row = sparse_array_first (sx->memory, &idx); row != NULL; + row = sparse_array_next (sx->memory, idx, &idx)) + free (*row); + sparse_array_destroy (sx->memory); + sx->memory = NULL; + } +} + /* Destroys sparse array of rows SX. */ void sparse_xarray_destroy (struct sparse_xarray *sx) @@ -141,15 +156,7 @@ sparse_xarray_destroy (struct sparse_xarray *sx) if (sx != NULL) { free (sx->default_row); - if (sx->memory != NULL) - { - unsigned long int idx; - uint8_t **row; - for (row = sparse_array_first (sx->memory, &idx); row != NULL; - row = sparse_array_next (sx->memory, idx, &idx)) - free (*row); - sparse_array_destroy (sx->memory); - } + free_memory_rows (sx); ext_array_destroy (sx->disk); range_set_destroy (sx->disk_rows); free (sx); @@ -208,8 +215,7 @@ dump_sparse_xarray_to_disk (struct sparse_xarray *sx) } range_set_set1 (sx->disk_rows, idx, 1); } - sparse_array_destroy (sx->memory); - sx->memory = NULL; + free_memory_rows (sx); return true; } -- 2.30.2