From nobody Mon Feb 9 13:38:36 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1602402051; cv=none; d=zohomail.com; s=zohoarc; b=Z6x7r0DOW/A7HVHJYhuiUTQQeeMdMN4vJlc4w8U65GTOxaSiu0XY4wBmJjNV5Qz/9okb2hU8ROd2iAacba99H8BmOJCiWILaMzkPyyNgxvKDEzuZjybKLZsMNmetPcUzuiMRb9sSppCb/1jIInCb2jb7tVNTy4vW+PmmdzSb7ok= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1602402051; 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=fHPYCqiyKGAD+Zc8/zz2fhKOml70BFrb+sHIjUM/cYM=; b=dtmPFeTX59rWCxEypXrhpu8sLTxTknFVAVazMcV/v0namQqxzPzH/8aLv703wNnPbl4Zo4/5JEU/lf/Qvy4Z04vbNILwicx/fBw6u1YKvLkHt2AxAfi0NnW1ibwL4vPeJUmceKAAX/a2yKX2AjgNYczzKPrEPWPP/I2evkJH6x8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; 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=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1602402051202665.2464437530315; Sun, 11 Oct 2020 00:40:51 -0700 (PDT) Received: from localhost ([::1]:55896 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kRVyM-0005gj-0f for importer@patchew.org; Sun, 11 Oct 2020 03:40:50 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:35916) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kRVt2-0006GC-J7 for qemu-devel@nongnu.org; Sun, 11 Oct 2020 03:35:20 -0400 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:42852) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kRVsx-0003H4-M5 for qemu-devel@nongnu.org; Sun, 11 Oct 2020 03:35:20 -0400 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-445-RqBuCnqFO4msgEnCJJzFiA-1; Sun, 11 Oct 2020 03:35:07 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id CC192107AD96; Sun, 11 Oct 2020 07:35:06 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-112-182.ams2.redhat.com [10.36.112.182]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 9B5C160C07; Sun, 11 Oct 2020 07:35:06 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 1B7D4112CE10; Sun, 11 Oct 2020 09:35:05 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1602401711; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=fHPYCqiyKGAD+Zc8/zz2fhKOml70BFrb+sHIjUM/cYM=; b=fqqRQ0kZdWjF5iMPR8+QEa7j05tOMJy8w1EYH8zfcUu6GVnljBvBOo24FUck7EobjCvtHK ZE9MzpYSK+/KyvRXi1mexzHgO2gRrlXoHX6ztJLpvNiMOQTvaQNzYOLLuu+diksdUTqtVt 2o29IOojGx6rGIL+2oMrPOWAnECRKCI= X-MC-Unique: RqBuCnqFO4msgEnCJJzFiA-1 From: Markus Armbruster To: qemu-devel@nongnu.org Subject: [PATCH v4 3/7] keyval: Fix parsing of ',' in value of implied key Date: Sun, 11 Oct 2020 09:35:01 +0200 Message-Id: <20201011073505.1185335-4-armbru@redhat.com> In-Reply-To: <20201011073505.1185335-1-armbru@redhat.com> References: <20201011073505.1185335-1-armbru@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=armbru@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable 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=216.205.24.124; envelope-from=armbru@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/10/11 02:10:40 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, 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_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, qemu-block@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" The previous commit demonstrated documentation and code disagree on parsing of ',' in the value of an implied key. Fix the code to match the documentation. This breaks uses of keyval_parse() that pass an implied key and accept a value containing ','. None of the existing uses does: * audiodev: implied key "driver" is enum AudiodevDriver, none of the values contains ',' * display: implied key "type" is enum DisplayType, none of the values contains ',' * blockdev: implied key "driver is enum BlockdevDriver, none of the values contains ',' * export: implied key "type" is enum BlockExportType, none of the values contains ',' * monitor: implied key "mode" is enum MonitorMode, none of the values contains ',' * nbd-server: no implied key. Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake --- tests/test-keyval.c | 8 +++----- util/keyval.c | 28 +++++++++++++++++----------- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/tests/test-keyval.c b/tests/test-keyval.c index f02bdf7029..04c62cf045 100644 --- a/tests/test-keyval.c +++ b/tests/test-keyval.c @@ -183,11 +183,9 @@ static void test_keyval_parse(void) g_assert(!qdict); =20 /* Implied key's value can't have comma (qemu_opts_parse(): it can) */ - /* BUG: it can */ - qdict =3D keyval_parse("val,,ue", "implied", &error_abort); - g_assert_cmpuint(qdict_size(qdict), =3D=3D, 1); - g_assert_cmpstr(qdict_get_try_str(qdict, "implied"), =3D=3D, "val,ue"); - qobject_unref(qdict); + qdict =3D keyval_parse("val,,ue", "implied", &err); + error_free_or_abort(&err); + g_assert(!qdict); =20 /* Empty key is not an implied key */ qdict =3D keyval_parse("=3Dval", "implied", &err); diff --git a/util/keyval.c b/util/keyval.c index 82d8497c71..8f33a36a7c 100644 --- a/util/keyval.c +++ b/util/keyval.c @@ -173,7 +173,7 @@ static const char *keyval_parse_one(QDict *qdict, const= char *params, const char *implied_key, Error **errp) { - const char *key, *key_end, *s, *end; + const char *key, *key_end, *val_end, *s, *end; size_t len; char key_in_cur[128]; QDict *cur; @@ -182,10 +182,12 @@ static const char *keyval_parse_one(QDict *qdict, con= st char *params, QString *val; =20 key =3D params; + val_end =3D NULL; len =3D strcspn(params, "=3D,"); if (implied_key && len && key[len] !=3D '=3D') { /* Desugar implied key */ key =3D implied_key; + val_end =3D params + len; len =3D strlen(implied_key); } key_end =3D key + len; @@ -241,7 +243,11 @@ static const char *keyval_parse_one(QDict *qdict, cons= t char *params, =20 if (key =3D=3D implied_key) { assert(!*s); - s =3D params; + val =3D qstring_from_substr(params, 0, val_end - params); + s =3D val_end; + if (*s =3D=3D ',') { + s++; + } } else { if (*s !=3D '=3D') { error_setg(errp, "Expected '=3D' after parameter '%.*s'", @@ -249,19 +255,19 @@ static const char *keyval_parse_one(QDict *qdict, con= st char *params, return NULL; } s++; - } =20 - val =3D qstring_new(); - for (;;) { - if (!*s) { - break; - } else if (*s =3D=3D ',') { - s++; - if (*s !=3D ',') { + val =3D qstring_new(); + for (;;) { + if (!*s) { break; + } else if (*s =3D=3D ',') { + s++; + if (*s !=3D ',') { + break; + } } + qstring_append_chr(val, *s++); } - qstring_append_chr(val, *s++); } =20 if (!keyval_parse_put(cur, key_in_cur, val, key, key_end, errp)) { --=20 2.26.2