From nobody Mon Feb 9 16:02:01 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 205.139.110.61 as permitted sender) client-ip=205.139.110.61; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-1.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 205.139.110.61 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1599191015; cv=none; d=zohomail.com; s=zohoarc; b=RdhPVqMXJbYpC0g9VwKA7oKNq8bVS4lD2wTL+jXgcsDiu1QvlSUWMX3cGWOWwQuNm51pqEUTT1ubLbSnJLLb0v3Aq6AVu4RU9yFC24spMpLgTXVNjnuyFNGHHEkzZ9NUo+Qg9YfREb6HB3DF47v10Ioc3teH/DYNPVNAqEHr7Wo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1599191015; h=Content-Type:Content-Transfer-Encoding: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=/mcRJfUctbwwMGypiRyEFprXtWqYRK5Zri+KLk7g5P0=; b=TdHSM4niyc0jpzHayzJIlcMsqK8XaZgFC04+NhEj9B6nQyIx+LcSNW7/5dihdl47jGuBdEucqvcgpL2vwhLtyp2LIHQ7EXY6qEsfZ3AeNp7S64DzXRA0q7OMwKyJy4LTyetHwG4N8IqlU9p1ZAMe6HFolOIeYOniAXmi0n/Bm7Q= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 205.139.110.61 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from us-smtp-delivery-1.mimecast.com (us-smtp-2.mimecast.com [205.139.110.61]) by mx.zohomail.com with SMTPS id 1599191015488578.3402508104302; Thu, 3 Sep 2020 20:43:35 -0700 (PDT) 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-430-IfxZm-aAOGS8_RaYLi0DOQ-1; Thu, 03 Sep 2020 23:43:32 -0400 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 A419B85B684; Fri, 4 Sep 2020 03:43:26 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 815AF1002D5E; Fri, 4 Sep 2020 03:43:26 +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 514D297310; Fri, 4 Sep 2020 03:43:26 +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 0843fO3U030935 for ; Thu, 3 Sep 2020 23:41:24 -0400 Received: by smtp.corp.redhat.com (Postfix) id 53FFC2157F25; Fri, 4 Sep 2020 03:41:24 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast01.extmail.prod.ext.rdu2.redhat.com [10.11.55.17]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 4F1B62166B27 for ; Fri, 4 Sep 2020 03:41:24 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) (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 3188F8F6E68 for ; Fri, 4 Sep 2020 03:41:24 +0000 (UTC) Received: from mail-m24147.qiye.163.com (mail-m24147.qiye.163.com [220.194.24.147]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-488-kHBm9tRLOpitp0W5DG6eNQ-1; Thu, 03 Sep 2020 23:41:21 -0400 Received: from localhost.localdomain (unknown [58.56.27.130]) by smtp4 (Coremail) with SMTP id JedpCgAHcNgStlFfYHYgCg--.1426S43; Fri, 04 Sep 2020 11:35:58 +0800 (CST) X-MC-Unique: IfxZm-aAOGS8_RaYLi0DOQ-1 X-MC-Unique: kHBm9tRLOpitp0W5DG6eNQ-1 From: Shi Lei To: libvir-list@redhat.com Subject: [RFCv2 41/46] conf: Extract error-checking code from virDomainGraphicsListenDefParseXML Date: Fri, 4 Sep 2020 11:35:33 +0800 Message-Id: <20200904033538.418579-42-shi_lei@massclouds.com> In-Reply-To: <20200904033538.418579-1-shi_lei@massclouds.com> References: <20200904033538.418579-1-shi_lei@massclouds.com> MIME-Version: 1.0 X-CM-TRANSID: JedpCgAHcNgStlFfYHYgCg--.1426S43 X-Coremail-Antispam: 1Uf129KBjvJXoW3Ar4fuFWUXryxWw4rCF1rZwb_yoWfZF4UpF 95XF4DtF45Kr1fCrZaqa18Zw43WFykG39rWrZYqw12vrWUWr4xAr4I9a42gr17Gr18Za13 ZF10qr4j9r4ayF7anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDUYxBIdaVFxhVjvjDU0xZFpf9x0pRrgA3UUUUU= X-Originating-IP: [58.56.27.130] X-CM-SenderInfo: pvklsz1hl6ztxvvfz0xxgvhudrp/1tbiVx6VT1f4py2YTgAAsg 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 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.003 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Signed-off-by: Shi Lei --- src/conf/domain_conf.c | 207 ++++++++++++++++++++++++----------------- 1 file changed, 121 insertions(+), 86 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 0802c45..d1602ab 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -14119,55 +14119,19 @@ virDomainTimerDefParseXML(xmlNodePtr node, } =20 =20 -/** - * virDomainGraphicsListenDefParseXML: - * @def: listen def pointer to be filled - * @graphics: graphics def pointer - * @node: xml node of element - * @parent: xml node of element - * @flags: bit-wise or of VIR_DOMAIN_DEF_PARSE_* - * - * Parses current element from @node to @def. For backward - * compatibility the @parent element should contain node of el= ement - * for the first element in order to validate attributes from bo= th - * elements. - */ static int -virDomainGraphicsListenDefParseXML(virDomainGraphicsListenDefPtr def, - virDomainGraphicsDefPtr graphics, - xmlNodePtr node, - xmlNodePtr parent, - unsigned int flags) +virDomainGraphicsListenDefParseXMLHook(xmlNodePtr node G_GNUC_UNUSED, + virDomainGraphicsListenDefPtr def, + const char *instname G_GNUC_UNUSED, + void *parent, + void *opaque, + const char *type G_GNUC_UNUSED, + const char *fromConfig, + const char *autoGenerated) { - int ret =3D -1; + unsigned int flags =3D *((unsigned int *) opaque); + virDomainGraphicsDefPtr graphics =3D (virDomainGraphicsDefPtr) parent; const char *graphicsType =3D virDomainGraphicsTypeToString(graphics->t= ype); - int tmp, typeVal; - g_autofree char *type =3D virXMLPropString(node, "type"); - g_autofree char *address =3D virXMLPropString(node, "address"); - g_autofree char *network =3D virXMLPropString(node, "network"); - g_autofree char *socketPath =3D virXMLPropString(node, "socket"); - g_autofree char *fromConfig =3D virXMLPropString(node, "fromConfig"); - g_autofree char *autoGenerated =3D virXMLPropString(node, "autoGenerat= ed"); - g_autofree char *addressCompat =3D NULL; - g_autofree char *socketCompat =3D NULL; - - if (parent) { - addressCompat =3D virXMLPropString(parent, "listen"); - socketCompat =3D virXMLPropString(parent, "socket"); - } - - if (!type) { - virReportError(VIR_ERR_XML_ERROR, "%s", - _("graphics listen type must be specified")); - goto error; - } - - if ((typeVal =3D virDomainGraphicsListenTypeFromString(type)) < 0) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("unknown graphics listen type '%s'"), type); - goto error; - } - def->type =3D typeVal; =20 switch (def->type) { case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET: @@ -14194,61 +14158,94 @@ virDomainGraphicsListenDefParseXML(virDomainGraph= icsListenDefPtr def, break; } =20 - if (def->type =3D=3D VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS) { - if (address && addressCompat && STRNEQ(address, addressCompat)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("graphics 'listen' attribute '%s' must match " - "'address' attribute of first listen element " - "(found '%s')"), addressCompat, address); - goto error; - } - - if (!address) - address =3D g_steal_pointer(&addressCompat); - } - - if (def->type =3D=3D VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET) { - if (socketPath && socketCompat && STRNEQ(socketPath, socketCompat)= ) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("graphics 'socket' attribute '%s' must match " - "'socket' attribute of first listen element " - "(found '%s')"), socketCompat, socketPath); + if (def->address && def->address[0]) { + if (def->type !=3D VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS && + (def->type !=3D VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NETWORK || + (flags & VIR_DOMAIN_DEF_PARSE_INACTIVE))) goto error; - } - - if (!socketPath) - socketPath =3D g_steal_pointer(&socketCompat); - } - - if (address && address[0] && - (def->type =3D=3D VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS || - (def->type =3D=3D VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NETWORK && - !(flags & VIR_DOMAIN_DEF_PARSE_INACTIVE)))) { - def->address =3D g_steal_pointer(&address); } =20 - if (network && network[0]) { + if (def->network && def->network[0]) { if (def->type !=3D VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NETWORK) { virReportError(VIR_ERR_XML_ERROR, "%s", _("'network' attribute is valid only for listen= " "type 'network'")); goto error; } - def->network =3D g_steal_pointer(&network); } =20 - if (socketPath && socketPath[0]) { + if (def->socket && def->socket[0]) { if (def->type !=3D VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET) { virReportError(VIR_ERR_XML_ERROR, "%s", _("'socket' attribute is valid only for listen " "type 'socket'")); goto error; } - def->socket =3D g_steal_pointer(&socketPath); } =20 - if (fromConfig && - flags & VIR_DOMAIN_DEF_PARSE_STATUS) { + if (fromConfig && !(flags & VIR_DOMAIN_DEF_PARSE_STATUS)) + def->fromConfig =3D 0; + + if (autoGenerated && !(flags & VIR_DOMAIN_DEF_PARSE_STATUS)) + def->autoGenerated =3D false; + + return 0; + + error: + return -1; +} + + +/** + * virDomainGraphicsListenDefParseXML: + * @def: listen def pointer to be filled + * @graphics: graphics def pointer + * @node: xml node of element + * @flags: bit-wise or of VIR_DOMAIN_DEF_PARSE_* + * + * Parses current element from @node to @def. For backward + * compatibility the @parent element should contain node of el= ement + * for the first element in order to validate attributes from bo= th + * elements. + */ +static int +virDomainGraphicsListenDefParseXML(virDomainGraphicsListenDefPtr def, + virDomainGraphicsDefPtr graphics, + xmlNodePtr node, + unsigned int flags) +{ + int ret =3D -1; + int tmp, typeVal; + g_autofree char *type =3D virXMLPropString(node, "type"); + g_autofree char *address =3D virXMLPropString(node, "address"); + g_autofree char *network =3D virXMLPropString(node, "network"); + g_autofree char *socketPath =3D virXMLPropString(node, "socket"); + g_autofree char *fromConfig =3D virXMLPropString(node, "fromConfig"); + g_autofree char *autoGenerated =3D virXMLPropString(node, "autoGenerat= ed"); + + if (!type) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("graphics listen type must be specified")); + goto error; + } + + if ((typeVal =3D virDomainGraphicsListenTypeFromString(type)) < 0) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("unknown graphics listen type '%s'"), type); + goto error; + } + def->type =3D typeVal; + + if (address && address[0]) + def->address =3D g_steal_pointer(&address); + + if (network && network[0]) + def->network =3D g_steal_pointer(&network); + + if (socketPath && socketPath[0]) + def->socket =3D g_steal_pointer(&socketPath); + + if (fromConfig) { if (virStrToLong_i(fromConfig, NULL, 10, &tmp) < 0) { virReportError(VIR_ERR_XML_ERROR, _("Invalid fromConfig value: %s"), @@ -14258,8 +14255,7 @@ virDomainGraphicsListenDefParseXML(virDomainGraphic= sListenDefPtr def, def->fromConfig =3D tmp !=3D 0; } =20 - if (autoGenerated && - flags & VIR_DOMAIN_DEF_PARSE_STATUS) { + if (autoGenerated) { if (virStringParseYesNo(autoGenerated, &def->autoGenerated) < 0) { virReportError(VIR_ERR_XML_ERROR, _("Invalid autoGenerated value: %s"), @@ -14268,6 +14264,11 @@ virDomainGraphicsListenDefParseXML(virDomainGraphi= csListenDefPtr def, } } =20 + if (virDomainGraphicsListenDefParseXMLHook(node, def, NULL, + graphics, &flags, type, + fromConfig, autoGenerated) = < 0) + goto error; + ret =3D 0; error: if (ret < 0) @@ -14303,12 +14304,46 @@ virDomainGraphicsListensParseXML(virDomainGraphic= sDefPtr def, goto cleanup; =20 for (i =3D 0; i < nListens; i++) { - if (virDomainGraphicsListenDefParseXML(&def->listens[i], def, + virDomainGraphicsListenDefPtr listen =3D &def->listens[i]; + if (virDomainGraphicsListenDefParseXML(listen, def, listenNodes[i], - i =3D=3D 0 ? node : NUL= L, flags) < 0) goto cleanup; =20 + if (i =3D=3D 0) { + g_autofree char *addressCompat =3D NULL; + g_autofree char *socketCompat =3D NULL; + + addressCompat =3D virXMLPropString(node, "listen"); + socketCompat =3D virXMLPropString(node, "socket"); + + if (listen->type =3D=3D VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_AD= DRESS) { + if (listen->address && addressCompat && STRNEQ(listen-= >address, addressCompat)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("graphics 'listen' attribute '%s'= must match " + "'address' attribute of first lis= ten element " + "(found '%s')"), addressCompat, l= isten->address); + goto cleanup; + } + + if (!listen->address) + listen->address =3D g_steal_pointer(&addressCompat= ); + } + + if (listen->type =3D=3D VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SO= CKET) { + if (listen->socket && socketCompat && STRNEQ(listen->s= ocket, socketCompat)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("graphics 'socket' attribute '%s'= must match " + "'socket' attribute of first list= en element " + "(found '%s')"), socketCompat, li= sten->socket); + goto cleanup; + } + + if (!listen->socket) + listen->socket =3D g_steal_pointer(&socketCompat); + } + } + def->nListens++; } } --=20 2.25.1