On Thu, 9 Jul 2026 at 09:47, Alexander Mikhalitsyn <[email protected]> wrote: > > From: Alexander Mikhalitsyn <[email protected]> > > Let's use GPtrArray to build a list of blocker features and then > g_strjoinv() to build a final comma-delimited string. > > While previous approach was technically correct, it is fragile > (because we need to take care of static buffer size choice) and > Coverity dislikes it too. > > Note, that we use g_ptr_array_new() to allocate array which means > that GDestroyNotify callback is not set, so we can pass pointers to > a static memory like g_ptr_array_add(..., (gpointer) "SR-IOV") without > any problems as there won't be any attempt to free that memory. > > Resolves: Coverity CID 1663673 > Suggested-by: Peter Maydell <[email protected]> > Signed-off-by: Alexander Mikhalitsyn <[email protected]> > --- > hw/nvme/ctrl.c | 41 +++++++++++++++++------------------------ > 1 file changed, 17 insertions(+), 24 deletions(-) > > diff --git a/hw/nvme/ctrl.c b/hw/nvme/ctrl.c > index a67e1598891..95a586d82a9 100644 > --- a/hw/nvme/ctrl.c > +++ b/hw/nvme/ctrl.c > @@ -9352,22 +9352,11 @@ static void nvme_init_ctrl(NvmeCtrl *n, PCIDevice > *pci_dev) > } > } > > -#define BLOCKER_FEATURES_MAX_LEN 256 > - > -static inline void nvme_add_blocker_feature(char *blocker_features, > - const char *feature) > -{ > - if (strlen(blocker_features) > 0) { > - g_strlcat(blocker_features, ", ", BLOCKER_FEATURES_MAX_LEN); > - } > - g_strlcat(blocker_features, feature, BLOCKER_FEATURES_MAX_LEN); > -} > - > static bool nvme_set_migration_blockers(NvmeCtrl *n, PCIDevice *pci_dev, > Error **errp) > { > uint64_t unsupported_cap, cap = ldq_le_p(&n->bar.cap); > - char blocker_features[BLOCKER_FEATURES_MAX_LEN] = ""; > + g_autoptr(GPtrArray) blocker_features = g_ptr_array_new(); > bool adm_cmd_security_checked = false; > bool cmd_io_mgmt_checked = false; > bool cmd_zone_checked = false; > @@ -9416,15 +9405,15 @@ static bool nvme_set_migration_blockers(NvmeCtrl *n, > PCIDevice *pci_dev, > } > > if (namespaces_num > 1) { > - nvme_add_blocker_feature(blocker_features, > - "Namespace Attachment"); > + g_ptr_array_add(blocker_features, > + (gpointer) "Namespace Attachment");
Is the cast here because we're dropping the const property of the literal string? thanks -- PMM
