From 844b75f4d677b4ddb398798d1cb0fcc68d53bbb5 Mon Sep 17 00:00:00 2001 From: Zdenek Kabelac Date: Sun, 13 Mar 2011 23:05:48 +0000 Subject: [PATCH] Fix allocation of system_id As code uses strncpy(system_id, NAME_LEN) and doesn't set '\0' Fix it by always allocating NAME_LEN + 1 buffer size and with zalloc we always get '\0' as the last byte. This bug may trigger some unexpected behavior of the string operation code - depends on the pool allocator. FIXME: refactor this code to alloc_vg. --- WHATS_NEW | 1 + lib/format1/import-export.c | 2 +- lib/format_text/import_vsn1.c | 2 +- lib/metadata/metadata.c | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/WHATS_NEW b/WHATS_NEW index 3611b0200..431b3f61c 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,5 +1,6 @@ Version 2.02.85 - =================================== + Fix allocation of system_id buffer in volume_group structure. Fix buffer allocation in build_dm_uuid(). Fix readlink usage inside get_primary_dev(). Use format instance mempool where possible and adequate. diff --git a/lib/format1/import-export.c b/lib/format1/import-export.c index d0b1b31fd..c065016bd 100644 --- a/lib/format1/import-export.c +++ b/lib/format1/import-export.c @@ -225,7 +225,7 @@ int import_vg(struct dm_pool *mem, if (!(vg->name = dm_pool_strdup(mem, (char *)dl->pvd.vg_name))) return_0; - if (!(vg->system_id = dm_pool_alloc(mem, NAME_LEN))) + if (!(vg->system_id = dm_pool_zalloc(mem, NAME_LEN + 1))) return_0; *vg->system_id = '\0'; diff --git a/lib/format_text/import_vsn1.c b/lib/format_text/import_vsn1.c index 06c7d29da..3292e325f 100644 --- a/lib/format_text/import_vsn1.c +++ b/lib/format_text/import_vsn1.c @@ -666,7 +666,7 @@ static struct volume_group *_read_vg(struct format_instance *fid, if (!(vg = alloc_vg("read_vg", fid->fmt->cmd, vgn->key))) return_NULL; - if (!(vg->system_id = dm_pool_zalloc(vg->vgmem, NAME_LEN))) + if (!(vg->system_id = dm_pool_zalloc(vg->vgmem, NAME_LEN + 1))) goto_bad; vgn = vgn->child; diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c index e7c402199..1fbe8ccbf 100644 --- a/lib/metadata/metadata.c +++ b/lib/metadata/metadata.c @@ -934,7 +934,7 @@ struct volume_group *vg_create(struct cmd_context *cmd, const char *vg_name) } vg->status = (RESIZEABLE_VG | LVM_READ | LVM_WRITE); - if (!(vg->system_id = dm_pool_alloc(vg->vgmem, NAME_LEN))) + if (!(vg->system_id = dm_pool_zalloc(vg->vgmem, NAME_LEN + 1))) goto_bad; *vg->system_id = '\0'; -- 2.43.5