aboutsummaryrefslogtreecommitdiff
path: root/liblvm
diff options
context:
space:
mode:
authorTony Asleson <tasleson@redhat.com>2013-08-14 15:14:42 -0500
committerTony Asleson <tasleson@redhat.com>2013-08-14 15:17:39 -0500
commitc29c64f20dadbd9076d8729bd3d0cb724c4b39b0 (patch)
treebf7c6d0c79f405672de964dfe73d3823876ecb84 /liblvm
parent732e609fe2e337fa7f4c2b3308d0bc6187269947 (diff)
downloadlvm2-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.c19
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;