From nobody Sat Feb 7 10:44:35 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) client-ip=216.205.24.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1607709969; cv=none; d=zohomail.com; s=zohoarc; b=lA9msUFjUpEnFt7mYaTpiQQu+BdAoV4i1IBE80XRWIfU/feT5PVWF/sfnIEFj1zvF6V7Tjl7DZDWpPjmb/EKh0LQymAOfoEmtNNzPP50igNdG0BdzqefItkJbaDyRWywa64vgfFojvjO95yrEd9HWUvDeGAWD/VxRwq6LlC8hLQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1607709969; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=qebHr6IKHxmKmvmyGxKfnK8DdZdjCSl2xj9PCn+CZK4=; b=T5ysqwgV6RfA64V3Q6x28aJa0PnRIi5R+oEt4bLuEsCzhT5xKP/6yqPVgb8+fVAUTjohFOcNxVAtFnq74PwcmaS0cWLt1gW/wOgcqcuXNONDS7yuY90qmRDkw9eIszwhZlcKLdx65g5pJKmFSeqZcORCWsm3NGzemRELWoKuNvY= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by mx.zohomail.com with SMTPS id 1607709968847923.1306974944963; Fri, 11 Dec 2020 10:06:08 -0800 (PST) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-243-vltiiYIZOpin1NPlsDSTVQ-1; Fri, 11 Dec 2020 13:06:01 -0500 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 666A9107ACE6; Fri, 11 Dec 2020 18:05:51 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 3FD221002393; Fri, 11 Dec 2020 18:05:51 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 07EEE1809CA2; Fri, 11 Dec 2020 18:05:51 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 0BBI5a33027541 for ; Fri, 11 Dec 2020 13:05:36 -0500 Received: by smtp.corp.redhat.com (Postfix) id 389492166B2A; Fri, 11 Dec 2020 18:05:36 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast04.extmail.prod.ext.rdu2.redhat.com [10.11.55.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 3365C2166B29 for ; Fri, 11 Dec 2020 18:05:36 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-2.mimecast.com [205.139.110.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 1B0CC1010424 for ; Fri, 11 Dec 2020 18:05:36 +0000 (UTC) Received: from mail-qt1-f195.google.com (mail-qt1-f195.google.com [209.85.160.195]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-592-AvXrKBedP0eN2s_0naCejg-1; Fri, 11 Dec 2020 13:05:33 -0500 Received: by mail-qt1-f195.google.com with SMTP id y15so7062937qtv.5 for ; Fri, 11 Dec 2020 10:05:33 -0800 (PST) Received: from rekt.ibmuc.com ([2804:431:c7c6:9e32:a7fb:6602:e8c2:3c0f]) by smtp.gmail.com with ESMTPSA id y6sm7585703qkj.60.2020.12.11.10.05.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 11 Dec 2020 10:05:32 -0800 (PST) X-MC-Unique: vltiiYIZOpin1NPlsDSTVQ-1 X-MC-Unique: AvXrKBedP0eN2s_0naCejg-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=qebHr6IKHxmKmvmyGxKfnK8DdZdjCSl2xj9PCn+CZK4=; b=hOIa1TmCdT5A9+7jKzDk4k8qT42zUuazmvBgD9UAwEeXBiWoIIuEmTGhYpB2zTeJ86 JS2kDeumUku+rO6y4GdUmp2DYQ4EKnziVyklo4CRDAOpTveBZgKvOjVCCU45KctoU/ar db6sYufSRxiev670OLj4sSGIE+XyoIpO8qxD7G6dNUfdgs4cj61onbEydUNWUXeL5nq7 sAr/GvoTRIyNwqyUywwPe4qLWpV9tWX9xgndz17ltgcAJOxgtW5ImqCRBYE/D9tGa5P0 pk/60WcK1oopmq70+pv13ZF5liWJi088YJ/TsUH7NiAR40KL1jW7nK+Pj/sZ0i0qkpYs u6Rw== X-Gm-Message-State: AOAM532eQV8OdyPdvSN2YfnvHKwNg+2QAvJayTRZ2h8sN161ejfFzN6C l8RW+BJQLnxUjkKytGZ3zmlt9sMvfzfW9Q== X-Google-Smtp-Source: ABdhPJxpJmqd2RJcrizCZL5HUNQKr69OIOaTWlzsfkM+ivfYjEE8ghWadoK7lGyE/PgJ+4BgK2c46Q== X-Received: by 2002:ac8:6bc2:: with SMTP id b2mr17684988qtt.286.1607709932968; Fri, 11 Dec 2020 10:05:32 -0800 (PST) From: Daniel Henrique Barboza To: libvir-list@redhat.com Subject: [PATCH 03/12] domain_conf: move address validation functions to domain_validate.c Date: Fri, 11 Dec 2020 15:05:07 -0300 Message-Id: <20201211180516.1952683-4-danielhb413@gmail.com> In-Reply-To: <20201211180516.1952683-1-danielhb413@gmail.com> References: <20201211180516.1952683-1-danielhb413@gmail.com> MIME-Version: 1.0 X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.78 on 10.11.54.6 X-loop: libvir-list@redhat.com Cc: Daniel Henrique Barboza X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" virDomainDefValidateAliases() is one of the static functions that needs to be handled before moving virDomainDefValidateInternal(). Let's move all related validate functions to domain_validate.c at the same time. Signed-off-by: Daniel Henrique Barboza --- src/conf/domain_conf.c | 144 +------------------------------------ src/conf/domain_conf.h | 14 ++-- src/conf/domain_validate.c | 138 +++++++++++++++++++++++++++++++++++ src/conf/domain_validate.h | 5 ++ src/libvirt_private.syms | 5 +- src/qemu/qemu_driver.c | 1 + 6 files changed, 159 insertions(+), 148 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index d3ea79b708..0425fbaca3 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -4213,16 +4213,11 @@ virDomainSkipBackcompatConsole(virDomainDefPtr def, } =20 =20 -enum { - DOMAIN_DEVICE_ITERATE_ALL_CONSOLES =3D 1 << 0, - DOMAIN_DEVICE_ITERATE_MISSING_INFO =3D 1 << 1, -} virDomainDeviceIterateFlags; - /* * Iterates over domain devices calling @cb on each device. The default * behaviour can be altered with virDomainDeviceIterateFlags. */ -static int +int virDomainDeviceInfoIterateFlags(virDomainDefPtr def, virDomainDeviceInfoCallback cb, unsigned int iteratorFlags, @@ -6427,143 +6422,6 @@ virDomainDeviceDefValidateInternal(const virDomainD= eviceDef *dev, } =20 =20 -struct virDomainDefValidateAliasesData { - GHashTable *aliases; -}; - - -static int -virDomainDeviceDefValidateAliasesIterator(virDomainDefPtr def, - virDomainDeviceDefPtr dev, - virDomainDeviceInfoPtr info, - void *opaque) -{ - struct virDomainDefValidateAliasesData *data =3D opaque; - const char *alias =3D info->alias; - - if (!virDomainDeviceAliasIsUserAlias(alias)) - return 0; - - /* Some crazy backcompat for consoles. */ - if (def->nserials && def->nconsoles && - def->consoles[0]->deviceType =3D=3D VIR_DOMAIN_CHR_DEVICE_TYPE_CON= SOLE && - def->consoles[0]->targetType =3D=3D VIR_DOMAIN_CHR_CONSOLE_TARGET_= TYPE_SERIAL && - dev->type =3D=3D VIR_DOMAIN_DEVICE_CHR && - virDomainChrEquals(def->serials[0], dev->data.chr)) - return 0; - - if (dev->type =3D=3D VIR_DOMAIN_DEVICE_HOSTDEV && - dev->data.hostdev->parentnet) { - /* This hostdev is a copy of some previous interface. - * Aliases are duplicated. */ - return 0; - } - - if (virHashLookup(data->aliases, alias)) { - virReportError(VIR_ERR_XML_ERROR, - _("non unique alias detected: %s"), - alias); - return -1; - } - - if (virHashAddEntry(data->aliases, alias, (void *) 1) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("Unable to construct table of device aliases")); - return -1; - } - - return 0; -} - - -/** - * virDomainDefValidateAliases: - * - * Check for uniqueness of device aliases. If @aliases is not - * NULL return hash table of all the aliases in it. - * - * Returns 0 on success, - * -1 otherwise (with error reported). - */ -static int -virDomainDefValidateAliases(const virDomainDef *def, - GHashTable **aliases) -{ - struct virDomainDefValidateAliasesData data; - int ret =3D -1; - - /* We are not storing copies of aliases. Don't free them. */ - if (!(data.aliases =3D virHashNew(NULL))) - goto cleanup; - - if (virDomainDeviceInfoIterateFlags((virDomainDefPtr) def, - virDomainDeviceDefValidateAliasesI= terator, - DOMAIN_DEVICE_ITERATE_ALL_CONSOLES, - &data) < 0) - goto cleanup; - - if (aliases) - *aliases =3D g_steal_pointer(&data.aliases); - - ret =3D 0; - cleanup: - virHashFree(data.aliases); - return ret; -} - - -static int -virDomainDeviceValidateAliasImpl(const virDomainDef *def, - virDomainDeviceDefPtr dev) -{ - GHashTable *aliases =3D NULL; - virDomainDeviceInfoPtr info =3D virDomainDeviceGetInfo(dev); - int ret =3D -1; - - if (!info || !info->alias) - return 0; - - if (virDomainDefValidateAliases(def, &aliases) < 0) - goto cleanup; - - if (virHashLookup(aliases, info->alias)) { - virReportError(VIR_ERR_XML_ERROR, - _("non unique alias detected: %s"), - info->alias); - goto cleanup; - } - - ret =3D 0; - cleanup: - - virHashFree(aliases); - return ret; -} - - -int -virDomainDeviceValidateAliasForHotplug(virDomainObjPtr vm, - virDomainDeviceDefPtr dev, - unsigned int flags) -{ - virDomainDefPtr persDef =3D NULL; - virDomainDefPtr liveDef =3D NULL; - - if (virDomainObjGetDefs(vm, flags, &liveDef, &persDef) < 0) - return -1; - - if (persDef && - virDomainDeviceValidateAliasImpl(persDef, dev) < 0) - return -1; - - if (liveDef && - virDomainDeviceValidateAliasImpl(liveDef, dev) < 0) - return -1; - - return 0; -} - - static int virDomainDeviceDefValidate(const virDomainDeviceDef *dev, const virDomainDef *def, diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 71e42d6617..ba03a55c7b 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2759,6 +2759,11 @@ typedef enum { VIR_DOMAIN_TAINT_LAST } virDomainTaintFlags; =20 +typedef enum { + DOMAIN_DEVICE_ITERATE_ALL_CONSOLES =3D 1 << 0, + DOMAIN_DEVICE_ITERATE_MISSING_INFO =3D 1 << 1, +} virDomainDeviceIterateFlags; + /* Guest VM runtime state */ typedef struct _virDomainStateReason virDomainStateReason; struct _virDomainStateReason { @@ -2987,10 +2992,6 @@ int virDomainDefPostParse(virDomainDefPtr def, void *parseOpaque); bool virDomainDefHasUSB(const virDomainDef *def); =20 -int virDomainDeviceValidateAliasForHotplug(virDomainObjPtr vm, - virDomainDeviceDefPtr dev, - unsigned int flags); - bool virDomainDeviceAliasIsUserAlias(const char *aliasStr); =20 int virDomainDefValidate(virDomainDefPtr def, @@ -3130,6 +3131,11 @@ virDomainChrSourceDefNew(virDomainXMLOptionPtr xmlop= t); =20 virDomainChrDefPtr virDomainChrDefNew(virDomainXMLOptionPtr xmlopt); =20 +int virDomainDeviceInfoIterateFlags(virDomainDefPtr def, + virDomainDeviceInfoCallback cb, + unsigned int iteratorFlags, + void *opaque); + virDomainGraphicsDefPtr virDomainGraphicsDefNew(virDomainXMLOptionPtr xmlopt); =20 diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c index 8bbd60c836..962336033f 100644 --- a/src/conf/domain_validate.c +++ b/src/conf/domain_validate.c @@ -760,3 +760,141 @@ virDomainDefDuplicateDriveAddressesValidate(const vir= DomainDef *def) =20 return 0; } + + + +struct virDomainDefValidateAliasesData { + GHashTable *aliases; +}; + + +static int +virDomainDeviceDefValidateAliasesIterator(virDomainDefPtr def, + virDomainDeviceDefPtr dev, + virDomainDeviceInfoPtr info, + void *opaque) +{ + struct virDomainDefValidateAliasesData *data =3D opaque; + const char *alias =3D info->alias; + + if (!virDomainDeviceAliasIsUserAlias(alias)) + return 0; + + /* Some crazy backcompat for consoles. */ + if (def->nserials && def->nconsoles && + def->consoles[0]->deviceType =3D=3D VIR_DOMAIN_CHR_DEVICE_TYPE_CON= SOLE && + def->consoles[0]->targetType =3D=3D VIR_DOMAIN_CHR_CONSOLE_TARGET_= TYPE_SERIAL && + dev->type =3D=3D VIR_DOMAIN_DEVICE_CHR && + virDomainChrEquals(def->serials[0], dev->data.chr)) + return 0; + + if (dev->type =3D=3D VIR_DOMAIN_DEVICE_HOSTDEV && + dev->data.hostdev->parentnet) { + /* This hostdev is a copy of some previous interface. + * Aliases are duplicated. */ + return 0; + } + + if (virHashLookup(data->aliases, alias)) { + virReportError(VIR_ERR_XML_ERROR, + _("non unique alias detected: %s"), + alias); + return -1; + } + + if (virHashAddEntry(data->aliases, alias, (void *) 1) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Unable to construct table of device aliases")); + return -1; + } + + return 0; +} + + +/** + * virDomainDefValidateAliases: + * + * Check for uniqueness of device aliases. If @aliases is not + * NULL return hash table of all the aliases in it. + * + * Returns 0 on success, + * -1 otherwise (with error reported). + */ +int +virDomainDefValidateAliases(const virDomainDef *def, + GHashTable **aliases) +{ + struct virDomainDefValidateAliasesData data; + int ret =3D -1; + + /* We are not storing copies of aliases. Don't free them. */ + if (!(data.aliases =3D virHashNew(NULL))) + goto cleanup; + + if (virDomainDeviceInfoIterateFlags((virDomainDefPtr) def, + virDomainDeviceDefValidateAliasesI= terator, + DOMAIN_DEVICE_ITERATE_ALL_CONSOLES, + &data) < 0) + goto cleanup; + + if (aliases) + *aliases =3D g_steal_pointer(&data.aliases); + + ret =3D 0; + cleanup: + virHashFree(data.aliases); + return ret; +} + + +static int +virDomainDeviceValidateAliasImpl(const virDomainDef *def, + virDomainDeviceDefPtr dev) +{ + GHashTable *aliases =3D NULL; + virDomainDeviceInfoPtr info =3D virDomainDeviceGetInfo(dev); + int ret =3D -1; + + if (!info || !info->alias) + return 0; + + if (virDomainDefValidateAliases(def, &aliases) < 0) + goto cleanup; + + if (virHashLookup(aliases, info->alias)) { + virReportError(VIR_ERR_XML_ERROR, + _("non unique alias detected: %s"), + info->alias); + goto cleanup; + } + + ret =3D 0; + cleanup: + + virHashFree(aliases); + return ret; +} + + +int +virDomainDeviceValidateAliasForHotplug(virDomainObjPtr vm, + virDomainDeviceDefPtr dev, + unsigned int flags) +{ + virDomainDefPtr persDef =3D NULL; + virDomainDefPtr liveDef =3D NULL; + + if (virDomainObjGetDefs(vm, flags, &liveDef, &persDef) < 0) + return -1; + + if (persDef && + virDomainDeviceValidateAliasImpl(persDef, dev) < 0) + return -1; + + if (liveDef && + virDomainDeviceValidateAliasImpl(liveDef, dev) < 0) + return -1; + + return 0; +} diff --git a/src/conf/domain_validate.h b/src/conf/domain_validate.h index 1f1a5b1bd1..521a98ef11 100644 --- a/src/conf/domain_validate.h +++ b/src/conf/domain_validate.h @@ -47,3 +47,8 @@ int virDomainControllerDefValidate(const virDomainControl= lerDef *controller); int virDomainDefIdMapValidate(const virDomainDef *def); int virDomainDefDuplicateDiskInfoValidate(const virDomainDef *def); int virDomainDefDuplicateDriveAddressesValidate(const virDomainDef *def); +int virDomainDefValidateAliases(const virDomainDef *def, + GHashTable **aliases); +int virDomainDeviceValidateAliasForHotplug(virDomainObjPtr vm, + virDomainDeviceDefPtr dev, + unsigned int flags); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 992488f754..c3056232db 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -354,7 +354,6 @@ virDomainDeviceGetInfo; virDomainDeviceInfoIterate; virDomainDeviceSetData; virDomainDeviceTypeToString; -virDomainDeviceValidateAliasForHotplug; virDomainDiskBackingStoreFormat; virDomainDiskBackingStoreParse; virDomainDiskBusTypeToString; @@ -744,6 +743,10 @@ virDomainConfNWFilterTeardown; virDomainConfVMNWFilterTeardown; =20 =20 +# conf/domain_validate.h +virDomainDeviceValidateAliasForHotplug; + + # conf/interface_conf.h virInterfaceDefFormat; virInterfaceDefFree; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 58c376fbe5..5f0fb0a55f 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -70,6 +70,7 @@ #include "domain_audit.h" #include "domain_cgroup.h" #include "domain_driver.h" +#include "domain_validate.h" #include "node_device_conf.h" #include "virpci.h" #include "virusb.h" --=20 2.26.2