From nobody Sun Jul 26 10:07:33 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=mihalicyn.com ARC-Seal: i=1; a=rsa-sha256; t=1783586923; cv=none; d=zohomail.com; s=zohoarc; b=iSBMSsVPPcWEI0oCg5e33AwAw/+6xYWWHFX6mD+LMJv9LinzoiUfGDDUJlC28rOt8GmR9qGsiy0psijfBxc5Nuky0XRMIJqAVCnDDL/GRpjjHOZsayHCHjYqx6YaQQyykg/cNGJhMm+HiHj0AN0QpxyYhb/jblZpBUAhKhTbpMs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1783586923; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=tWykkhUvZImzKk7PMKYU/gQ1ZJJOoPXOpglztp/ahl8=; b=Qdi0jFcai9hmbwOUvadEFIRuAWM2uTt9X401seDzCWO3qsCMWlc1VskQIrvvFFurjX/BIhjRaQU7v/XP6dhrwiv32MJzU4ECNmHlwA5ssBmjgoQAhaHndOMeCgPAQSlfEWycbPxmyWXroPCzK8iyazLEPNg57ve7EYp5iO8+XKY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1783586923380947.6223990723487; Thu, 9 Jul 2026 01:48:43 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1whkPx-0002Sl-I1; Thu, 09 Jul 2026 04:47:37 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1whkPv-0002SN-LB for qemu-devel@nongnu.org; Thu, 09 Jul 2026 04:47:35 -0400 Received: from mail-wm1-x329.google.com ([2a00:1450:4864:20::329]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1whkPt-0005nL-Md for qemu-devel@nongnu.org; Thu, 09 Jul 2026 04:47:35 -0400 Received: by mail-wm1-x329.google.com with SMTP id 5b1f17b1804b1-493d1e8aa46so12313145e9.0 for ; Thu, 09 Jul 2026 01:47:32 -0700 (PDT) Received: from alex-laptop.lan (p200300cf574a72003e9c5bb9189c1bc2.dip0.t-ipconnect.de. [2003:cf:574a:7200:3e9c:5bb9:189c:1bc2]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-493eb6d4f9fsm44791685e9.4.2026.07.09.01.47.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Jul 2026 01:47:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mihalicyn.com; s=mihalicyn; t=1783586851; x=1784191651; darn=nongnu.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to:content-type; bh=tWykkhUvZImzKk7PMKYU/gQ1ZJJOoPXOpglztp/ahl8=; b=J3dpbayXHZFn0Z47OSxBivgRCCT38OUBLf6bjsTm1tfYxCQdDGlwkV5YQ41WbMG2Ez B4at/8vOFepr2jmOjSIwSf2Tlc5cIjvMQbbfoyS0t59ZatuGZGYXVbILdQaYqQZ/tN+z a4LhVv6y9E137PD1ovXfpzlxR1F3NZ2xYl9m4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783586851; x=1784191651; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=tWykkhUvZImzKk7PMKYU/gQ1ZJJOoPXOpglztp/ahl8=; b=rFLTO0ls5uS6PxsiIgEcX1Qii62UNe5KyUdaF4oyR0KdGspq3BcyZrgNbAGej9E9gf hpAfriWzlS8E1aD4Vi243jjC+165YWQ5o2AdwJ562CZsS2pt+OKRdnHakouks7OIqPIo VXpdmzHlAbH0fO6qDZmK9jtIjj0MFq1fEARv2XL4y9EFfxdHdqQpHFEl2/OJr6OdfLQk 6RBMfoBZR7buHV64w+XbGXZdUbUwwNLBA2lX1WEv1vMQ2lrBiy8NkuornPpXnbg/yG28 elYlqqAvW/khzx514+XPmoHxznzp+7w/nVo52xepxyWHr6g+OftESspbLdLYehPK18zU OvaA== X-Gm-Message-State: AOJu0YzCMK185zyc3Ivk7ofCUgvpVUBLZ1v7PXUvx/pxtGQBjS/WimEF WRgdR2SitEdjAPLWISAsJXSctSU5lpBhj+1RmgAOI/2zOpRj87JZvqWB3VcC+HylJVIHmPFfg39 IFe1Lb4x+pg== X-Gm-Gg: AfdE7clh5smhAPqIN682bNTO64EQR02dDL27SwxE1hXsxWJgH7NNUgLDqxZo33Hdq4w d+jSRMUXcn+gUwMTjkdD7XkGHYJXmdfGuoBQTUjJZcJJnwNMwI0GmKB2Eb/pWmjdbVotGmNjrIX 1jJt77p6w0OadhDGyAI6IlfY1UKQMlV/aUq9ueXx9/kjJvrN5HpYVRoxIJkXVrZY4q+UNqJ9oK5 AbV1hhs/PbiKcLi7+St24ActoZZoWz7Yaor+4gwFXXqDWveA+KEv7UloqkHIb/2KzqTQEWa71td vCkWgXaKhUsacSD002xmFkFHiVOHrcYW55gm1wjde2BiLNQ9ZdSWX0WrYHfJifVOYa64atPPHNH fSFQ/E5x0cJuGz/i2pdARRRNdtWaPgeo1RbmVCUbKB/ppt6hkt6RFszzhAlmArwa8tTV9FtsTnJ uEUOKOznuCIqnSOB7mm31IIArRuDtIiLWRCs9y6tdKiom9HZDkUhXyAGEKOAuzhRoU3kvh9h9E3 OTovObuNtha X-Received: by 2002:a05:600d:8498:20b0:493:d115:d835 with SMTP id 5b1f17b1804b1-493e68b8094mr47441755e9.8.1783586850644; Thu, 09 Jul 2026 01:47:30 -0700 (PDT) From: Alexander Mikhalitsyn To: qemu-devel@nongnu.org Cc: Peter Maydell , qemu-block@nongnu.org, Klaus Jensen , Keith Busch , alexander@mihalicyn.com, Jesper Devantier , Alexander Mikhalitsyn Subject: [PATCH] hw/nvme: use GPtrArray for blocker_features Date: Thu, 9 Jul 2026 10:47:28 +0200 Message-ID: <20260709084728.92862-1-alexander@mihalicyn.com> X-Mailer: git-send-email 2.47.3 MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::329; envelope-from=alexander@mihalicyn.com; helo=mail-wm1-x329.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @mihalicyn.com) X-ZM-MESSAGEID: 1783586926388158500 Content-Type: text/plain; charset="utf-8" From: Alexander Mikhalitsyn 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 Signed-off-by: Alexander Mikhalitsyn Reviewed-by: Peter Maydell --- 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) } } =20 -#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 =3D ldq_le_p(&n->bar.cap); - char blocker_features[BLOCKER_FEATURES_MAX_LEN] =3D ""; + g_autoptr(GPtrArray) blocker_features =3D g_ptr_array_new(); bool adm_cmd_security_checked =3D false; bool cmd_io_mgmt_checked =3D false; bool cmd_zone_checked =3D false; @@ -9416,15 +9405,15 @@ static bool nvme_set_migration_blockers(NvmeCtrl *n= , PCIDevice *pci_dev, } =20 if (namespaces_num > 1) { - nvme_add_blocker_feature(blocker_features, - "Namespace Attachment"); + g_ptr_array_add(blocker_features, + (gpointer) "Namespace Attachment"= ); } =20 break; } case NVME_ADM_CMD_VIRT_MNGMT: if (n->params.sriov_max_vfs) { - nvme_add_blocker_feature(blocker_features, "SR-IOV"); + g_ptr_array_add(blocker_features, (gpointer) "SR-IOV"); } =20 break; @@ -9435,7 +9424,7 @@ static bool nvme_set_migration_blockers(NvmeCtrl *n, = PCIDevice *pci_dev, } =20 if (pci_dev->spdm_port) { - nvme_add_blocker_feature(blocker_features, "SPDM"); + g_ptr_array_add(blocker_features, (gpointer) "SPDM"); } =20 adm_cmd_security_checked =3D true; @@ -9469,7 +9458,7 @@ static bool nvme_set_migration_blockers(NvmeCtrl *n, = PCIDevice *pci_dev, =20 /* check for NVME_IOMS_MO_RUH_UPDATE */ if (n->subsys->params.fdp.enabled) { - nvme_add_blocker_feature(blocker_features, "FDP"); + g_ptr_array_add(blocker_features, (gpointer) "FDP"); } =20 cmd_io_mgmt_checked =3D true; @@ -9504,8 +9493,8 @@ static bool nvme_set_migration_blockers(NvmeCtrl *n, = PCIDevice *pci_dev, } =20 if (ns->params.zoned) { - nvme_add_blocker_feature(blocker_features, - "Zoned Namespace"); + g_ptr_array_add(blocker_features, + (gpointer) "Zoned Namespace"); break; } } @@ -9525,24 +9514,28 @@ static bool nvme_set_migration_blockers(NvmeCtrl *n= , PCIDevice *pci_dev, * covered by unsupported_cap check. */ if (NVME_CAP_CMBS(cap)) { - nvme_add_blocker_feature(blocker_features, "CMB"); + g_ptr_array_add(blocker_features, (gpointer) "CMB"); cap &=3D ~((uint64_t)CAP_CMBS_MASK << CAP_CMBS_SHIFT); } =20 if (NVME_CAP_PMRS(cap)) { - nvme_add_blocker_feature(blocker_features, "PMR"); + g_ptr_array_add(blocker_features, (gpointer) "PMR"); cap &=3D ~((uint64_t)CAP_PMRS_MASK << CAP_PMRS_SHIFT); } =20 unsupported_cap =3D cap & ~NVME_MIGRATION_SUPPORTED_CAP_BITS; if (unsupported_cap) { - nvme_add_blocker_feature(blocker_features, "unknown capability"); + g_ptr_array_add(blocker_features, (gpointer) "unknown capability"); } =20 assert(n->migration_blocker =3D=3D NULL); - if (strlen(blocker_features) > 0) { + if (blocker_features->len > 0) { + g_autofree char *blocker_list =3D NULL; + + g_ptr_array_add(blocker_features, NULL); + blocker_list =3D g_strjoinv(", ", (void *)blocker_features->pdata); error_setg(&n->migration_blocker, - "Migration is not supported for %s", blocker_features); + "Migration is not supported for %s", blocker_list); if (migrate_add_blocker(&n->migration_blocker, errp) < 0) { return false; } --=20 2.47.3