From nobody Sat Nov 23 17:42:42 2024 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=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1732017918; cv=none; d=zohomail.com; s=zohoarc; b=JIsolzJY4o1LsUzlZcNtMScb1AYpnPk0YYN6s6yV8eRmAWUYSBuAiG6ACjAPK3QZNZXBNNUTfdB+dcwFJiHccRL8tw03ZLO/K+cN+AbGB5U781lIH5Va4E0DjyK/hkwW1TAPx8XR/+N9/eYH5/5hwCcGPafGRhT4n6tK4F3sp5w= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1732017918; 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=muqJE7H13rE5IDL42UfFZuBczLGmxKWDKeI5esPWwUw=; b=GZny5utpy734SVuPRE2xw5Thlza44yU+AbXzP7+L51iztSz1SIIiNRQTuJyZbQpRZISKVAHoBcuQOg31sjkjXqTMgiSUidRxnytyvb60kZR4I+HH6lKaGy83jyYgVu9Hjri3pyfmxxetawNc6yB+FOV4UVv7wbl0GUC1rwq/YZo= 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=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1732017918165178.41609517313475; Tue, 19 Nov 2024 04:05:18 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tDMy8-00037f-2d; Tue, 19 Nov 2024 07:04:33 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tDMxu-00036z-NM for qemu-devel@nongnu.org; Tue, 19 Nov 2024 07:04:20 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tDMxs-0008Gu-Ca for qemu-devel@nongnu.org; Tue, 19 Nov 2024 07:04:18 -0500 Received: from mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-517-0t44KvZENyK07Wvm21xyzQ-1; Tue, 19 Nov 2024 07:04:11 -0500 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 2CC861955F06; Tue, 19 Nov 2024 12:04:09 +0000 (UTC) Received: from merkur.redhat.com (unknown [10.39.193.242]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 9FF9B1956056; Tue, 19 Nov 2024 12:04:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1732017854; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding; bh=muqJE7H13rE5IDL42UfFZuBczLGmxKWDKeI5esPWwUw=; b=Wl8SDZ7juzPT0xEA88rxy7AmZVlCXMZE0AZT9iJ9cc9DmgSv491FSlTFOCBKk3SuHA3vDw F23hUTVlGqbq0eFFaM8ypAwMZ3JEoeKZ0rfqpZqjp/+XviXnHLRjovU8dYJLtExeEsB3at ZiM8xckXnvK7li0hQXBJS3bu54C4WM0= X-MC-Unique: 0t44KvZENyK07Wvm21xyzQ-1 X-Mimecast-MFC-AGG-ID: 0t44KvZENyK07Wvm21xyzQ From: Kevin Wolf To: qemu-devel@nongnu.org Cc: kwolf@redhat.com, peter.maydell@linaro.org, armbru@redhat.com, pbonzini@redhat.com, berrange@redhat.com, eduardo@habkost.net, qemu-stable@nongnu.org Subject: [PATCH] qdev: Fix set_pci_devfn() to visit option only once Date: Tue, 19 Nov 2024 13:03:53 +0100 Message-ID: <20241119120353.57812-1-kwolf@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 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=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=kwolf@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -21 X-Spam_score: -2.2 X-Spam_bar: -- X-Spam_report: (-2.2 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.142, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, 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: 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 @redhat.com) X-ZM-MESSAGEID: 1732017920673116600 Content-Type: text/plain; charset="utf-8" pci_devfn properties accept either a string or an integer as input. To implement this, set_pci_devfn() first tries to visit the option as a string, and if that fails, it visits it as an integer instead. While the QemuOpts visitor happens to accept this, it is invalid according to the visitor interface. QObject input visitors run into an assertion failure when this is done. QObject input visitors are used with the JSON syntax version of -device on the command line: $ ./qemu-system-x86_64 -enable-kvm -M q35 -device pcie-pci-bridge,id=3Dpci.= 1,bus=3Dpcie.0 -blockdev null-co,node-name=3Ddisk -device '{ "driver": "vir= tio-blk-pci", "drive": "disk", "id": "virtio-disk0", "bus": "pci.1", "addr"= : 1 }' qemu-system-x86_64: ../qapi/qobject-input-visitor.c:143: QObject *qobject_i= nput_try_get_object(QObjectInputVisitor *, const char *, _Bool): Assertion = `removed' failed. The proper way to accept both strings and integers is using the alternate mechanism, which tells us the type of the input before it's visited. With this information, we can directly visit it as the right type. This fixes set_pci_devfn() by using the alternate mechanism. Cc: qemu-stable@nongnu.org Reported-by: Peter Maydell Signed-off-by: Kevin Wolf Acked-by: Paolo Bonzini Reviewed-by: Markus Armbruster --- hw/core/qdev-properties-system.c | 54 +++++++++++++++++++++----------- 1 file changed, 36 insertions(+), 18 deletions(-) diff --git a/hw/core/qdev-properties-system.c b/hw/core/qdev-properties-sys= tem.c index 35deef05f3..91d3ff4719 100644 --- a/hw/core/qdev-properties-system.c +++ b/hw/core/qdev-properties-system.c @@ -790,39 +790,57 @@ static void set_pci_devfn(Object *obj, Visitor *v, co= nst char *name, void *opaque, Error **errp) { Property *prop =3D opaque; + GenericAlternate *alt; int32_t value, *ptr =3D object_field_prop_ptr(obj, prop); unsigned int slot, fn, n; - char *str; + g_autofree char *str =3D NULL; + + if (!visit_start_alternate(v, name, &alt, sizeof(*alt), errp)) { + return; + } + + switch (alt->type) { + case QTYPE_QSTRING: + if (!visit_type_str(v, name, &str, errp)) { + goto out; + } =20 - if (!visit_type_str(v, name, &str, NULL)) { + if (sscanf(str, "%x.%x%n", &slot, &fn, &n) !=3D 2) { + fn =3D 0; + if (sscanf(str, "%x%n", &slot, &n) !=3D 1) { + goto invalid; + } + } + if (str[n] !=3D '\0' || fn > 7 || slot > 31) { + goto invalid; + } + *ptr =3D slot << 3 | fn; + break; + + case QTYPE_QNUM: if (!visit_type_int32(v, name, &value, errp)) { - return; + goto out; } if (value < -1 || value > 255) { error_setg(errp, QERR_INVALID_PARAMETER_VALUE, name ? name : "null", "a value between -1 and 255"); - return; + goto out; } *ptr =3D value; - return; - } + break; =20 - if (sscanf(str, "%x.%x%n", &slot, &fn, &n) !=3D 2) { - fn =3D 0; - if (sscanf(str, "%x%n", &slot, &n) !=3D 1) { - goto invalid; - } - } - if (str[n] !=3D '\0' || fn > 7 || slot > 31) { - goto invalid; + default: + error_setg(errp, "Invalid parameter type for '%s', expected int or= str", + name ? name : "null"); + goto out; } - *ptr =3D slot << 3 | fn; - g_free(str); - return; + + goto out; =20 invalid: error_set_from_qdev_prop_error(errp, EINVAL, obj, name, str); - g_free(str); +out: + visit_end_alternate(v, (void **) &alt); } =20 static int print_pci_devfn(Object *obj, Property *prop, char *dest, --=20 2.47.0