1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-21 13:34:40 +03:00

dmsetup: ensure --filemap histogram bounds are freed

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.
This commit is contained in:
Bryn M. Reeves 2016-09-14 15:44:51 +01:00
parent 5d455b28fc
commit 7ea5758c91

View File

@ -4951,12 +4951,12 @@ static char *_get_abspath(const char *path)
static int _stats_create_file(CMD_ARGS) static int _stats_create_file(CMD_ARGS)
{ {
const char *alias, *program_id = DM_STATS_PROGRAM_ID; 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; uint64_t *regions, *region, count = 0;
struct dm_histogram *bounds = NULL; struct dm_histogram *bounds = NULL;
char *path, *abspath = NULL; char *path, *abspath = NULL;
struct dm_stats *dms = NULL;
int group, fd, precise; int group, fd, precise;
struct dm_stats *dms;
if (_switches[AREAS_ARG] || _switches[AREA_SIZE_ARG]) { if (_switches[AREAS_ARG] || _switches[AREA_SIZE_ARG]) {
log_error("--filemap is incompatible with --areas and --area-size."); log_error("--filemap is incompatible with --areas and --area-size.");
@ -5017,7 +5017,8 @@ static int _stats_create_file(CMD_ARGS)
return 0; 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); dm_free(abspath);
return_0; return_0;
} }
@ -5031,7 +5032,7 @@ static int _stats_create_file(CMD_ARGS)
group = !_switches[NOGROUP_ARG]; group = !_switches[NOGROUP_ARG];
if (!(dms = dm_stats_create(DM_STATS_PROGRAM_ID))) if (!(dms = dm_stats_create(DM_STATS_PROGRAM_ID)))
return_0; goto_bad;
fd = open(abspath, O_RDONLY); fd = open(abspath, O_RDONLY);
@ -5087,16 +5088,20 @@ static int _stats_create_file(CMD_ARGS)
dm_free(regions); dm_free(regions);
dm_free(abspath); dm_free(abspath);
dm_free(bounds);
dm_stats_destroy(dms); dm_stats_destroy(dms);
return 1; return 1;
bad: bad:
dm_free(abspath); dm_free(abspath);
dm_free(bounds);
if ((fd > -1) && close(fd)) if ((fd > -1) && close(fd))
log_error("Error closing %s", path); log_error("Error closing %s", path);
dm_stats_destroy(dms); if (dms)
dm_stats_destroy(dms);
return 0; return 0;
} }