From 154befd4b86d9351fe2525812113b478c8182c3c Mon Sep 17 00:00:00 2001 From: Zdenek Kabelac Date: Tue, 11 Mar 2025 11:20:37 +0100 Subject: [PATCH] cache: ensure UUID ends with \0 Initialization of union is somewhat tricky as it initialize only the first member + padding, but in our case this does not clear the whole size of union so explicitly set \0 after 2 'struct id' and make sure DM uuid is not using random characters from stack. Also add explicit .id designators (c99). --- lib/activate/dev_manager.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/activate/dev_manager.c b/lib/activate/dev_manager.c index 6bc9c94ea..8caa9f997 100644 --- a/lib/activate/dev_manager.c +++ b/lib/activate/dev_manager.c @@ -2773,9 +2773,10 @@ static int _add_cvol_subdev_to_dtree(struct dev_manager *dm, struct dm_tree *dtr const struct logical_volume *pool_lv = lvseg->pool_lv; struct dm_info info; char *name ,*dlid; - union lvid lvid = { { lv->vg->id, _get_id_for_meta_or_data(lvseg, meta_or_data) } }; + union lvid lvid = { .id = { lv->vg->id, _get_id_for_meta_or_data(lvseg, meta_or_data) } }; + lvid.s[sizeof(lvid.id)] = 0; - if (!(dlid = dm_build_dm_uuid(mem, UUID_PREFIX, (const char *)&lvid.s, layer))) + if (!(dlid = dm_build_dm_uuid(mem, UUID_PREFIX, lvid.s, layer))) return_0; /* Name is actually not really needed here, but aids debugging... */ @@ -3426,9 +3427,10 @@ static int _add_new_cvol_subdev_to_dtree(struct dev_manager *dm, const struct logical_volume *pool_lv = lvseg->pool_lv; struct dm_tree_node *dnode; char *dlid, *dlid_pool, *name; - union lvid lvid = { { lv->vg->id, _get_id_for_meta_or_data(lvseg, meta_or_data) } }; + union lvid lvid = { .id = { lv->vg->id, _get_id_for_meta_or_data(lvseg, meta_or_data) } }; + lvid.s[sizeof(lvid.id)] = 0; - if (!(dlid = dm_build_dm_uuid(dm->mem, UUID_PREFIX, (const char *)&lvid.s, layer))) + if (!(dlid = dm_build_dm_uuid(dm->mem, UUID_PREFIX, lvid.s, layer))) return_0; if (!(name = dm_build_dm_name(dm->mem, lv->vg->name, pool_lv->name, layer)))