diff --git a/WHATS_NEW b/WHATS_NEW index 207f3b1df..2b22b3164 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,5 +1,6 @@ Version 2.02.93 - ==================================== + Check all tags and LV names are in a valid form in vg_validate. Add tmpfiles.d style configuration for lvm2 lock and run directory. Add configure --with-tmpfilesdir for dir holding volatile-file configuration. Allow 'lvconvert --repair' to operate on RAID 4/5/6 diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c index 7def88513..66b4a0d4c 100644 --- a/lib/metadata/metadata.c +++ b/lib/metadata/metadata.c @@ -1,6 +1,6 @@ /* * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved. - * Copyright (C) 2004-2011 Red Hat, Inc. All rights reserved. + * Copyright (C) 2004-2012 Red Hat, Inc. All rights reserved. * * This file is part of LVM2. * @@ -2294,6 +2294,7 @@ int vg_validate(struct volume_group *vg) struct pv_list *pvl; struct lv_list *lvl; struct lv_segment *seg; + struct str_list *sl; char uuid[64] __attribute__((aligned(8))); int r = 1; uint32_t hidden_lv_count = 0, lv_count = 0, lv_visible_count = 0; @@ -2313,6 +2314,13 @@ int vg_validate(struct volume_group *vg) return 0; } + dm_list_iterate_items(sl, &vg->tags) + if (!validate_tag(sl->str)) { + log_error(INTERNAL_ERROR "VG %s tag %s has invalid form.", + vg->name, sl->str); + r = 0; + } + dm_list_iterate_items(pvl, &vg->pvs) { if (++pv_count > vg->pv_count) { log_error(INTERNAL_ERROR "PV list corruption detected in VG %s.", vg->name); @@ -2345,6 +2353,13 @@ int vg_validate(struct volume_group *vg) r = 0; } + dm_list_iterate_items(sl, &pvl->pv->tags) + if (!validate_tag(sl->str)) { + log_error(INTERNAL_ERROR "PV %s tag %s has invalid form.", + pv_dev_name(pvl->pv), sl->str); + r = 0; + } + if (!dm_hash_insert_binary(vhash.pvid, &pvl->pv->id, sizeof(pvl->pv->id), pvl->pv)) { log_error("Failed to hash pvid."); @@ -2384,6 +2399,18 @@ int vg_validate(struct volume_group *vg) r = 0; } + if (!validate_name(lvl->lv->name)) { + log_error(INTERNAL_ERROR "LV name %s has invalid form.", lvl->lv->name); + r = 0; + } + + dm_list_iterate_items(sl, &lvl->lv->tags) + if (!validate_tag(sl->str)) { + log_error(INTERNAL_ERROR "LV %s tag %s has invalid form.", + lvl->lv->name, sl->str); + r = 0; + } + if (lvl->lv->status & VISIBLE_LV) continue;