From nobody Sun Jan 25 10:15:21 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=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1769158822; cv=none; d=zohomail.com; s=zohoarc; b=P/XKsf8oV/seVMK5z+WBKx0bE5BUSIkejJ7DEzxKm6Xzd5RjZwoNPw5TVA3J4E5wxLuO76FNUsXBBwn7i/6wNru/VpDaXkhcFza5tNxmiJs2zCWoduMG+5eENaRHlEaTdNFDHnmua0Ozs6r42aD5L9J8VXrgeD9ccfU40KyxQ5M= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1769158822; 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=oYsjFvTz/Xmwb4jexeDknAg9qP172YNbZjmLLVTfc1I=; b=WtqpybFcwg7n6ZLlg+bZ8sUzjMqheCTE7ZTzk+ewomevqcvpUVKuv3WlE4aJCasrxyC3k+2GYOMC7uChKJy9Yeyv48kl+EfLCpYXYF34N8H+OHh/Qx2fNAEgNhngFrnTASleEgGUFVUhTnm7YnPZXnoe0e8AK8c1H3hh3yJgW4c= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1769158822450118.610476102093; Fri, 23 Jan 2026 01:00:22 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vjD1B-0003lq-Jv; Fri, 23 Jan 2026 03:59:49 -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 1vjD12-0003iz-5t for qemu-devel@nongnu.org; Fri, 23 Jan 2026 03:59:44 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vjD0w-000881-My for qemu-devel@nongnu.org; Fri, 23 Jan 2026 03:59:37 -0500 Received: from mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-182-94AHuVJDNpSHOXmloNY6jA-1; Fri, 23 Jan 2026 03:59:28 -0500 Received: from mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.12]) (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-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 6BF2718005BB; Fri, 23 Jan 2026 08:59:27 +0000 (UTC) Received: from blackfin.pond.sub.org (unknown [10.45.242.3]) by mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 2567D1958DC9; Fri, 23 Jan 2026 08:59:27 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 7545A21E692D; Fri, 23 Jan 2026 09:59:24 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1769158770; 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=oYsjFvTz/Xmwb4jexeDknAg9qP172YNbZjmLLVTfc1I=; b=dgel5puZ7HS0OteAMbSRO9dcb3wzcHd9mXvc75oTCdwWC4H2Gy0SVI8Y1Rvj5NrlebY6rV rY4+GM+OFUAugO0CCZDVKWpM4VGNMh9ycwsB0DF/lTc+PZvClSJLb72TCMJ57DtCX1xn3o XefshdeaOQTxbqN6VNpHyvw07vq+1Xc= X-MC-Unique: 94AHuVJDNpSHOXmloNY6jA-1 X-Mimecast-MFC-AGG-ID: 94AHuVJDNpSHOXmloNY6jA_1769158767 From: Markus Armbruster To: qemu-devel@nongnu.org Cc: pbonzini@redhat.com, berrange@redhat.com, eduardo@habkost.net, stefanha@redhat.com Subject: [PATCH] qdev-monitor: Fix qdev ID validation regression Date: Fri, 23 Jan 2026 09:59:24 +0100 Message-ID: <20260123085924.1392134-1-armbru@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.0 on 10.30.177.12 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.133.124; envelope-from=armbru@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.07, 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_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_PASS=-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 @redhat.com) X-ZM-MESSAGEID: 1769158824811154100 Content-Type: text/plain; charset="utf-8" User-created qdevs with ID show up at /machine/peripheral/ID. When we restricted QemOpts IDs to letters, digits, '-', '.', '_', starting with a letter in commit b560a9ab9be: (qemu-option: Reject anti-social IDs) a long time ago, this also covered qdev IDs. Looks like this: (qemu) device_add usb-mouse,id=3D/ qemu-system-x86_64: Parameter 'id' expects an identifier Identifiers consist of letters, digits, '-', '.', '_', starting with a = letter. Try "help device_add" for more information QMP, however: {"execute": "device_add", "arguments": {"driver": "usb-mouse", "id": "/= "}} {"return": {}} This creates a device with canonical path "/machine/peripheral//". That way is madness. We accidentally bypassed qdev ID validation for QMP when we cut the detour through QemuOpts in commit b30d8054642. Fix by validating IDs one layer down, in qdev_set_id(). Arguably, QOM should protect itself from QOM path components containing '/', but let's just fix the regression for now. Fixes: be93fd53723c (qdev-monitor: avoid QemuOpts in QMP device_add) Signed-off-by: Markus Armbruster Reviewed-by: Stefan Hajnoczi --- system/qdev-monitor.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/system/qdev-monitor.c b/system/qdev-monitor.c index be18902bb2..e9e1fbe3b7 100644 --- a/system/qdev-monitor.c +++ b/system/qdev-monitor.c @@ -34,6 +34,7 @@ #include "qemu/config-file.h" #include "qemu/error-report.h" #include "qemu/help_option.h" +#include "qemu/id.h" #include "qemu/option.h" #include "qemu/qemu-print.h" #include "qemu/option_int.h" @@ -601,14 +602,17 @@ const char *qdev_set_id(DeviceState *dev, char *id, E= rror **errp) * has no parent */ if (id) { + if (!id_wellformed(id)) { + error_setg(errp, "Invalid qdev ID '%s'", id); + goto err; + } prop =3D object_property_try_add_child(qdev_get_peripheral(), id, OBJECT(dev), NULL); if (prop) { dev->id =3D id; } else { error_setg(errp, "Duplicate device ID '%s'", id); - g_free(id); - return NULL; + goto err; } } else { static int anon_count; @@ -619,6 +623,10 @@ const char *qdev_set_id(DeviceState *dev, char *id, Er= ror **errp) } =20 return prop->name; + +err: + g_free(id); + return NULL; } =20 BusState *qdev_find_default_bus(DeviceClass *dc, Error **errp) --=20 2.52.0