From nobody Mon Feb 9 02:14:21 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1555344176; cv=none; d=zoho.com; s=zohoarc; b=gvdVYdC+9WEKWge+P6Np/2Z/KDsieRQMf1prvxIWIA7cbwYaYZb+QVLpYHIvP8l+CfI410SJwma/cVvs3h2z+z3mPD1jJNO8W/cl+PRbEnNNbb1Ly9clkJutUFJawfkWYtPYa7GuTM5dhYBpSBocNaBWZbqJ0UmMxr6lw9WPGhw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1555344176; 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:ARC-Authentication-Results; bh=OIHSfl+tAO9kwu+HRIS9roQdWCdHmxl+DZqSAXdWsgs=; b=GeDyKVYkCfugdfIQ8QCtIfXzXRa4I7azmMGEMk3Z8IwkS1IAh/NmDYoADERHi1NcOODzJK+NhQI0afg50I4cAiHvcBizea7Pz1/bqGQ8CPZyW854kSZg4L8wmknQokh7GlN9vfqIchGe8VLi84SaCoqU1t/RV+NLVXiskpApBDU= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1555344176747224.88603214107854; Mon, 15 Apr 2019 09:02:56 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 0580D3092662; Mon, 15 Apr 2019 16:02:55 +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 CC0026014E; Mon, 15 Apr 2019 16:02:54 +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 8278B181B9EC; Mon, 15 Apr 2019 16:02:54 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x3FG2TE1003402 for ; Mon, 15 Apr 2019 12:02:29 -0400 Received: by smtp.corp.redhat.com (Postfix) id 1BFFD1001947; Mon, 15 Apr 2019 16:02:29 +0000 (UTC) Received: from angien.brq.redhat.com (unknown [10.43.2.229]) by smtp.corp.redhat.com (Postfix) with ESMTP id 9892C1001E89 for ; Mon, 15 Apr 2019 16:02:28 +0000 (UTC) From: Peter Krempa To: libvir-list@redhat.com Date: Mon, 15 Apr 2019 18:02:07 +0200 Message-Id: <91380eb9d7def413a0ddece62d20d4b89ef2b33f.1555344008.git.pkrempa@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 14/21] qemu: qapi: Report schema and user errors for QAPI queries 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: , Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.43]); Mon, 15 Apr 2019 16:02:55 +0000 (UTC) Content-Type: text/plain; charset="utf-8" We treated broken schema as failure to look up given query. Treat it as a separate error instead. It is unlikely to happen though. Also prepare for possibility of user errors if query components which can't be queired deeper have following components. Signed-off-by: Peter Krempa Reviewed-by: J=C3=A1n Tomko --- src/qemu/qemu_qapi.c | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/src/qemu/qemu_qapi.c b/src/qemu/qemu_qapi.c index 9a5becb26f..05e4922c57 100644 --- a/src/qemu/qemu_qapi.c +++ b/src/qemu/qemu_qapi.c @@ -70,6 +70,7 @@ virQEMUQAPISchemaObjectGet(const char *field, struct virQEMUQAPISchemaTraverseContext { + const char *prevquery; virHashTablePtr schema; char **queries; virJSONValuePtr returnType; @@ -90,9 +91,9 @@ virQEMUQAPISchemaTraverseContextInit(struct virQEMUQAPISc= hemaTraverseContext *ct static const char * virQEMUQAPISchemaTraverseContextNextQuery(struct virQEMUQAPISchemaTraverse= Context *ctxt) { - const char *query =3D ctxt->queries[0]; + ctxt->prevquery =3D ctxt->queries[0]; ctxt->queries++; - return query; + return ctxt->prevquery; } @@ -144,7 +145,7 @@ virQEMUQAPISchemaTraverseArray(virJSONValuePtr cur, /* arrays are just flattened by default */ if (!(querytype =3D virJSONValueObjectGetString(cur, "element-type"))) - return 0; + return -2; return virQEMUQAPISchemaTraverse(querytype, ctxt); } @@ -163,7 +164,9 @@ virQEMUQAPISchemaTraverseCommand(virJSONValuePtr cur, return virQEMUQAPISchemaTraverse(querytype, ctxt); } - +/* The function must return 1 on successful query, 0 if the query was not = found + * -1 when a libvirt error is reported, -2 if the schema is invalid and -3= if + * the query component is malformed. */ typedef int (*virQEMUQAPISchemaTraverseFunc)(virJSONValuePtr cur, struct virQEMUQAPISchemaTrave= rseContext *ctxt); @@ -190,7 +193,7 @@ virQEMUQAPISchemaTraverse(const char *baseName, size_t i; if (!(cur =3D virHashLookup(ctxt->schema, baseName))) - return 0; + return -2; if (!virQEMUQAPISchemaTraverseContextHasNextQuery(ctxt)) { ctxt->returnType =3D cur; @@ -198,7 +201,7 @@ virQEMUQAPISchemaTraverse(const char *baseName, } if (!(metatype =3D virJSONValueObjectGetString(cur, "meta-type"))) - return 0; + return -2; for (i =3D 0; i < ARRAY_CARDINALITY(traverseMetaType); i++) { if (STREQ(metatype, traverseMetaType[i].metatype)) @@ -250,6 +253,7 @@ virQEMUQAPISchemaPathGet(const char *query, { VIR_AUTOSTRINGLIST elems =3D NULL; struct virQEMUQAPISchemaTraverseContext ctxt; + const char *cmdname; int rc; if (entry) @@ -264,13 +268,30 @@ virQEMUQAPISchemaPathGet(const char *query, } virQEMUQAPISchemaTraverseContextInit(&ctxt, elems, schema); + cmdname =3D virQEMUQAPISchemaTraverseContextNextQuery(&ctxt); - rc =3D virQEMUQAPISchemaTraverse(virQEMUQAPISchemaTraverseContextNextQ= uery(&ctxt), &ctxt); + if (!virHashLookup(schema, cmdname)) + return 0; + + rc =3D virQEMUQAPISchemaTraverse(cmdname, &ctxt); if (entry) *entry =3D ctxt.returnType; - return rc; + if (rc >=3D 0) + return rc; + + if (rc =3D=3D -2) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("malformed QAPI schema when querying '%s' of '%s'= "), + NULLSTR(ctxt.prevquery), query); + } else if (rc =3D=3D -3) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("terminal QAPI query component '%s' of '%s' must = not have followers"), + NULLSTR(ctxt.prevquery), query); + } + + return -1; } --=20 2.20.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list