From: Zdenek Kabelac Date: Thu, 25 Feb 2016 12:31:31 +0000 (+0100) Subject: cleanup: poll better check for internal errors X-Git-Tag: v2_02_144~15 X-Git-Url: https://sourceware.org/git/?a=commitdiff_plain;h=5c29b54d4dbf0a94525172f5526fd5ff7996de48;p=lvm2.git cleanup: poll better check for internal errors --- diff --git a/tools/lvconvert.c b/tools/lvconvert.c index 23f3cf435..f6ea6147c 100644 --- a/tools/lvconvert.c +++ b/tools/lvconvert.c @@ -722,43 +722,40 @@ static struct poll_functions _lvconvert_thin_merge_fns = { .finish_copy = lvconvert_merge_finish, }; -static void _destroy_id(struct cmd_context *cmd, struct poll_operation_id *id) -{ - if (!id) - return; - - dm_pool_free(cmd->mem, (void *)id); -} - static struct poll_operation_id *_create_id(struct cmd_context *cmd, const char *vg_name, const char *lv_name, const char *uuid) { + struct poll_operation_id *id; char lv_full_name[NAME_LEN]; - struct poll_operation_id *id = dm_pool_alloc(cmd->mem, sizeof(struct poll_operation_id)); - if (!id) { - log_error("Poll operation ID allocation failed."); + + if (!vg_name || !lv_name || !uuid) { + log_error(INTERNAL_ERROR "Wrong params for lvconvert _create_id."); return NULL; } if (dm_snprintf(lv_full_name, sizeof(lv_full_name), "%s/%s", vg_name, lv_name) < 0) { log_error(INTERNAL_ERROR "Name \"%s/%s\" is too long.", vg_name, lv_name); - _destroy_id(cmd, id); return NULL; } - id->display_name = dm_pool_strdup(cmd->mem, lv_full_name); - id->vg_name = vg_name ? dm_pool_strdup(cmd->mem, vg_name) : NULL; - id->lv_name = id->display_name ? strchr(id->display_name, '/') + 1 : NULL; - id->uuid = uuid ? dm_pool_strdup(cmd->mem, uuid) : NULL; + if (!(id = dm_pool_alloc(cmd->mem, sizeof(*id)))) { + log_error("Poll operation ID allocation failed."); + return NULL; + } - if (!id->vg_name || !id->lv_name || !id->display_name || !id->uuid) { + if (!(id->display_name = dm_pool_strdup(cmd->mem, lv_full_name)) || + !(id->lv_name = strchr(id->display_name, '/')) || + !(id->vg_name = dm_pool_strdup(cmd->mem, vg_name)) || + !(id->uuid = dm_pool_strdup(cmd->mem, uuid))) { log_error("Failed to copy one or more poll operation ID members."); - _destroy_id(cmd, id); - id = NULL; + dm_pool_free(cmd->mem, id); + return NULL; } + id->lv_name++; /* skip over '/' */ + return id; } @@ -801,8 +798,6 @@ int lvconvert_poll(struct cmd_context *cmd, struct logical_volume *lv, r = _lvconvert_poll_by_id(cmd, id, background, is_merging_origin, is_merging_origin_thin); - _destroy_id(cmd, id); - return r; } diff --git a/tools/polldaemon.c b/tools/polldaemon.c index e662e16c1..8f1ff90cc 100644 --- a/tools/polldaemon.c +++ b/tools/polldaemon.c @@ -242,22 +242,22 @@ static struct poll_operation_id *copy_poll_operation_id(struct dm_pool *mem, { struct poll_operation_id *copy; - if (!id) - return_NULL; + if (!id || !id->vg_name || !id->lv_name || !id->display_name || !id->uuid) { + log_error(INTERNAL_ERROR "Wrong params for copy_poll_operation_id."); + return NULL; + } - copy = (struct poll_operation_id *) dm_pool_alloc(mem, sizeof(struct poll_operation_id)); - if (!copy) { + if (!(copy = dm_pool_alloc(mem, sizeof(*copy)))) { log_error("Poll operation ID allocation failed."); return NULL; } - copy->display_name = id->display_name ? dm_pool_strdup(mem, id->display_name) : NULL; - copy->lv_name = id->lv_name ? dm_pool_strdup(mem, id->lv_name) : NULL; - copy->vg_name = id->vg_name ? dm_pool_strdup(mem, id->vg_name) : NULL; - copy->uuid = id->uuid ? dm_pool_strdup(mem, id->uuid) : NULL; - - if (!copy->display_name || !copy->lv_name || !copy->vg_name || !copy->uuid) { + if (!(copy->display_name = dm_pool_strdup(mem, id->display_name)) || + !(copy->lv_name = dm_pool_strdup(mem, id->lv_name)) || + !(copy->vg_name = dm_pool_strdup(mem, id->vg_name)) || + !(copy->uuid = dm_pool_strdup(mem, id->uuid))) { log_error("Failed to copy one or more poll_operation_id members."); + dm_pool_free(mem, copy); return NULL; } diff --git a/tools/pvmove.c b/tools/pvmove.c index b590745ff..b5df45a1e 100644 --- a/tools/pvmove.c +++ b/tools/pvmove.c @@ -751,35 +751,31 @@ static struct poll_functions _pvmove_fns = { .finish_copy = pvmove_finish, }; -static void _destroy_id(struct cmd_context *cmd, struct poll_operation_id *id) +static struct poll_operation_id *_pvmove_create_id(struct cmd_context *cmd, + const char *pv_name, + const char *vg_name, + const char *lv_name, + const char *uuid) { - if (!id) - return; + struct poll_operation_id *id; - dm_pool_free(cmd->mem, id); -} + if (!vg_name || !lv_name || !pv_name || !uuid) { + log_error(INTERNAL_ERROR "Wrong params for _pvmove_create_id."); + return NULL; + } -static struct poll_operation_id *_create_id(struct cmd_context *cmd, - const char *pv_name, - const char *vg_name, - const char *lv_name, - const char *uuid) -{ - struct poll_operation_id *id = dm_pool_alloc(cmd->mem, sizeof(struct poll_operation_id)); - if (!id) { + if (!(id = dm_pool_alloc(cmd->mem, sizeof(*id)))) { log_error("Poll operation ID allocation failed."); return NULL; } - id->vg_name = vg_name ? dm_pool_strdup(cmd->mem, vg_name) : NULL; - id->lv_name = lv_name ? dm_pool_strdup(cmd->mem, lv_name) : NULL; - id->display_name = pv_name ? dm_pool_strdup(cmd->mem, pv_name) : NULL; - id->uuid = uuid ? dm_pool_strdup(cmd->mem, uuid) : NULL; - - if (!id->vg_name || !id->lv_name || !id->display_name || !id->uuid) { + if (!(id->vg_name = dm_pool_strdup(cmd->mem, vg_name)) || + !(id->lv_name = dm_pool_strdup(cmd->mem, lv_name)) || + !(id->display_name = dm_pool_strdup(cmd->mem, pv_name)) || + !(id->uuid = dm_pool_strdup(cmd->mem, uuid))) { log_error("Failed to copy one or more poll operation ID members."); - _destroy_id(cmd, id); - id = NULL; + dm_pool_free(cmd->mem, id); + return NULL; } return id; @@ -789,25 +785,18 @@ int pvmove_poll(struct cmd_context *cmd, const char *pv_name, const char *uuid, const char *vg_name, const char *lv_name, unsigned background) { - int r; struct poll_operation_id *id = NULL; - if (uuid) { - id = _create_id(cmd, pv_name, vg_name, lv_name, uuid); - if (!id) { - log_error("Failed to allocate poll identifier for pvmove."); - return ECMD_FAILED; - } + if (uuid && + !(id = _pvmove_create_id(cmd, pv_name, vg_name, lv_name, uuid))) { + log_error("Failed to allocate poll identifier for pvmove."); + return ECMD_FAILED; } if (test_mode()) - r = ECMD_PROCESSED; - else - r = poll_daemon(cmd, background, PVMOVE, &_pvmove_fns, "Moved", id); - - _destroy_id(cmd, id); + return ECMD_PROCESSED; - return r; + return poll_daemon(cmd, background, PVMOVE, &_pvmove_fns, "Moved", id); } int pvmove(struct cmd_context *cmd, int argc, char **argv)