diff options
author | Bryn M. Reeves <bmr@redhat.com> | 2016-09-14 15:44:51 +0100 |
---|---|---|
committer | Bryn M. Reeves <bmr@redhat.com> | 2016-09-14 15:52:37 +0100 |
commit | 0610f72c2ac86a5b70ce1c71019fc0874f071da1 (patch) | |
tree | b736386779c046445555413fb28027c5ef87ee1a | |
parent | 629059ee84e83b9d013d80e0b382a3474b30c7a4 (diff) | |
download | lvm2-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.c | 15 |
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; } |