summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBryn M. Reeves <bmr@redhat.com>2016-09-14 15:44:51 +0100
committerBryn M. Reeves <bmr@redhat.com>2016-09-14 15:52:37 +0100
commit0610f72c2ac86a5b70ce1c71019fc0874f071da1 (patch)
treeb736386779c046445555413fb28027c5ef87ee1a
parent629059ee84e83b9d013d80e0b382a3474b30c7a4 (diff)
downloadlvm2-dev-bmr-dmstats-memfixes.tar.gz
dmsetup: ensure --filemap histogram bounds are freeddev-bmr-dmstats-memfixes
Make sure that the temporary dm_histogram used for the bounds argument is freed in the case that the user provided a --bounds argument on the command line.
-rw-r--r--tools/dmsetup.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/tools/dmsetup.c b/tools/dmsetup.c
index ff42a9e58..5f4c19230 100644
--- a/tools/dmsetup.c
+++ b/tools/dmsetup.c
@@ -4951,12 +4951,12 @@ static char *_get_abspath(const char *path)
static int _stats_create_file(CMD_ARGS)
{
const char *alias, *program_id = DM_STATS_PROGRAM_ID;
- const char *histogram = _string_args[BOUNDS_ARG];
+ const char *bounds_str = _string_args[BOUNDS_ARG];
uint64_t *regions, *region, count = 0;
struct dm_histogram *bounds = NULL;
char *path, *abspath = NULL;
+ struct dm_stats *dms = NULL;
int group, fd, precise;
- struct dm_stats *dms;
if (_switches[AREAS_ARG] || _switches[AREA_SIZE_ARG]) {
log_error("--filemap is incompatible with --areas and --area-size.");
@@ -5017,7 +5017,8 @@ static int _stats_create_file(CMD_ARGS)
return 0;
}
- if (histogram && !(bounds = dm_histogram_bounds_from_string(histogram))) {
+ if (bounds_str
+ && !(bounds = dm_histogram_bounds_from_string(bounds_str))) {
dm_free(abspath);
return_0;
}
@@ -5031,7 +5032,7 @@ static int _stats_create_file(CMD_ARGS)
group = !_switches[NOGROUP_ARG];
if (!(dms = dm_stats_create(DM_STATS_PROGRAM_ID)))
- return_0;
+ goto_bad;
fd = open(abspath, O_RDONLY);
@@ -5087,16 +5088,20 @@ static int _stats_create_file(CMD_ARGS)
dm_free(regions);
dm_free(abspath);
+ dm_free(bounds);
dm_stats_destroy(dms);
return 1;
bad:
dm_free(abspath);
+ dm_free(bounds);
if ((fd > -1) && close(fd))
log_error("Error closing %s", path);
- dm_stats_destroy(dms);
+ if (dms)
+ dm_stats_destroy(dms);
+
return 0;
}