]> sourceware.org Git - lvm2.git/commitdiff
lvm2app: lvm_list_pvs_free seg. fault when no PVs
authorTony Asleson <tasleson@redhat.com>
Wed, 14 Aug 2013 20:14:42 +0000 (15:14 -0500)
committerTony Asleson <tasleson@redhat.com>
Wed, 14 Aug 2013 20:17:39 +0000 (15:17 -0500)
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>
liblvm/lvm_pv.c

index 2bd0ac0a2fd2a1c4891f00ab677f28f69831e947..e67e1eb9bf8cbfea7e67f96bcf1244aeff28668b 100644 (file)
@@ -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;
This page took 0.04357 seconds and 5 git commands to generate.