From nobody Sat May 4 12:32:08 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1516901019680529.363171493427; Thu, 25 Jan 2018 09:23:39 -0800 (PST) Received: from localhost ([::1]:52693 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eelFS-0002wI-4V for importer@patchew.org; Thu, 25 Jan 2018 12:23:38 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:60569) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eel6X-0004Kg-TE for qemu-devel@nongnu.org; Thu, 25 Jan 2018 12:14:26 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eel6S-0004rO-Ub for qemu-devel@nongnu.org; Thu, 25 Jan 2018 12:14:25 -0500 Received: from mx1.redhat.com ([209.132.183.28]:36826) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1eel6S-0004qk-P2 for qemu-devel@nongnu.org; Thu, 25 Jan 2018 12:14:20 -0500 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id F076B486C2 for ; Thu, 25 Jan 2018 17:14:19 +0000 (UTC) Received: from t460.redhat.com (unknown [10.33.36.65]) by smtp.corp.redhat.com (Postfix) with ESMTP id 5204E5D960; Thu, 25 Jan 2018 17:14:14 +0000 (UTC) From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: qemu-devel@nongnu.org Date: Thu, 25 Jan 2018 17:14:12 +0000 Message-Id: <20180125171412.21627-1-berrange@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Thu, 25 Jan 2018 17:14:20 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v2] sockets: fix parsing of ipv4/ipv6 opts in parse_socket_addr X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Paolo Bonzini , Gerd Hoffmann Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: "Daniel P. Berrange" The inet_parse() function looks for 'ipv4' and 'ipv6' flags, but only treats them as bare bool flags. The normal QemuOpts parsing would allow on/off values to be set too. This updates inet_parse() so that its handling of the 'ipv4' and 'ipv6' flags matches that done by QemuOpts. This impacts the NBD block driver parsing the legacy filename syntax and the migration code parsing the socket scheme. Signed-off-by: Daniel P. Berrange Reviewed-by: Eric Blake --- util/qemu-sockets.c | 44 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c index d6a1e1759e..300ebce795 100644 --- a/util/qemu-sockets.c +++ b/util/qemu-sockets.c @@ -554,6 +554,33 @@ err: } =20 /* compatibility wrapper */ +static int inet_parse_flag(const char *flagname, const char *optstr, bool = *val, + Error **errp) +{ + char *end; + size_t len; + + end =3D strstr(optstr, ","); + if (end) { + if (end[1] =3D=3D ',') { /* Reject 'ipv6=3Don,,foo' */ + error_setg(errp, "error parsing '%s' flag '%s'", flagname, opt= str); + return -1; + } + len =3D end - optstr; + } else { + len =3D strlen(optstr); + } + if (len =3D=3D 0 || (len =3D=3D 3 && strncmp(optstr, "=3Don", len) =3D= =3D 0)) { + *val =3D true; + } else if ((len =3D=3D 4) && strncmp(optstr, "=3Doff", len) =3D=3D 0) { + *val =3D false; + } else { + error_setg(errp, "error parsing '%s' flag '%s'", flagname, optstr); + return -1; + } + return 0; +} + int inet_parse(InetSocketAddress *addr, const char *str, Error **errp) { const char *optstr, *h; @@ -561,6 +588,7 @@ int inet_parse(InetSocketAddress *addr, const char *str= , Error **errp) char port[33]; int to; int pos; + char *begin; =20 memset(addr, 0, sizeof(*addr)); =20 @@ -602,11 +630,19 @@ int inet_parse(InetSocketAddress *addr, const char *s= tr, Error **errp) addr->has_to =3D true; addr->to =3D to; } - if (strstr(optstr, ",ipv4")) { - addr->ipv4 =3D addr->has_ipv4 =3D true; + begin =3D strstr(optstr, ",ipv4"); + if (begin) { + if (inet_parse_flag("ipv4", begin + 5, &addr->ipv4, errp) < 0) { + return -1; + } + addr->has_ipv4 =3D true; } - if (strstr(optstr, ",ipv6")) { - addr->ipv6 =3D addr->has_ipv6 =3D true; + begin =3D strstr(optstr, ",ipv6"); + if (begin) { + if (inet_parse_flag("ipv6", begin + 5, &addr->ipv6, errp) < 0) { + return -1; + } + addr->has_ipv6 =3D true; } return 0; } --=20 2.14.3