diff options
author | Tony Asleson <tasleson@redhat.com> | 2013-08-14 15:14:42 -0500 |
---|---|---|
committer | Tony Asleson <tasleson@redhat.com> | 2013-08-14 15:17:39 -0500 |
commit | c29c64f20dadbd9076d8729bd3d0cb724c4b39b0 (patch) | |
tree | bf7c6d0c79f405672de964dfe73d3823876ecb84 /liblvm | |
parent | 732e609fe2e337fa7f4c2b3308d0bc6187269947 (diff) | |
download | lvm2-c29c64f20dadbd9076d8729bd3d0cb724c4b39b0.tar.gz |
lvm2app: lvm_list_pvs_free seg. fault when no PVs
When the system has no PVs we don't have access to
the cmd pointer and it remains NULL which causes
a seg. fault when we try to free the VG lock.
Signed-off-by: Tony Asleson <tasleson@redhat.com>
Diffstat (limited to 'liblvm')
-rw-r--r-- | liblvm/lvm_pv.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/liblvm/lvm_pv.c b/liblvm/lvm_pv.c index 2bd0ac0a2..e67e1eb9b 100644 --- a/liblvm/lvm_pv.c +++ b/liblvm/lvm_pv.c @@ -65,6 +65,7 @@ struct lvm_property_value lvm_pvseg_get_property(const pvseg_t pvseg, struct lvm_list_wrapper { unsigned long magic; + struct cmd_context *cmd; struct dm_list pvslist; struct dm_list vgslist; }; @@ -84,6 +85,11 @@ struct dm_list *lvm_list_pvs(lvm_t libh) struct lvm_list_wrapper *rc = NULL; struct cmd_context *cmd = (struct cmd_context *)libh; + /* + * This memory will get cleared when the library handle + * gets closed, don't try to free is as it doesn't work + * like malloc/free do. + */ if (!(rc = dm_pool_zalloc(cmd->mem, sizeof(*rc)))) { log_errno(ENOMEM, "Memory allocation fail for pv list."); return NULL; @@ -95,9 +101,14 @@ struct dm_list *lvm_list_pvs(lvm_t libh) dm_list_init(&rc->pvslist); dm_list_init(&rc->vgslist); if( !get_pvs_perserve_vg(cmd, &rc->pvslist, &rc->vgslist) ) { - dm_pool_free(cmd->mem, rc); return NULL; } + + /* + * If we have no PVs we still need to have access to cmd + * pointer in the free call. + */ + rc->cmd = cmd; rc->magic = 0xF005BA11; } @@ -109,7 +120,6 @@ int lvm_list_pvs_free(struct dm_list *pvlist) struct lvm_list_wrapper *to_delete; struct vg_list *vgl; struct pv_list *pvl; - struct cmd_context *cmd = NULL; if (pvlist) { to_delete = dm_list_struct_base(pvlist, struct lvm_list_wrapper, pvslist); @@ -119,17 +129,14 @@ int lvm_list_pvs_free(struct dm_list *pvlist) } dm_list_iterate_items(vgl, &to_delete->vgslist) { - cmd = vgl->vg->cmd; release_vg(vgl->vg); } dm_list_iterate_items(pvl, &to_delete->pvslist) free_pv_fid(pvl->pv); - unlock_vg(cmd, VG_GLOBAL); - + unlock_vg(to_delete->cmd, VG_GLOBAL); to_delete->magic = 0xA5A5A5A5; - dm_pool_free(cmd->mem, to_delete); } return 0; |