From nobody Sun Feb 8 22:57:58 2026 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.zoho.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 1490691493764255.45819374798907; Tue, 28 Mar 2017 01:58:13 -0700 (PDT) Received: from localhost ([::1]:51684 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1csmxA-0001Zm-7v for importer@patchew.org; Tue, 28 Mar 2017 04:58:12 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39919) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1csmvK-0000DL-UT for qemu-devel@nongnu.org; Tue, 28 Mar 2017 04:56:20 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1csmvJ-0008Nu-AM for qemu-devel@nongnu.org; Tue, 28 Mar 2017 04:56:19 -0400 Received: from mx1.redhat.com ([209.132.183.28]:35104) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1csmvD-0008Gp-O7; Tue, 28 Mar 2017 04:56:11 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id A12E57AE85; Tue, 28 Mar 2017 08:56:10 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-26.ams2.redhat.com [10.36.116.26]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 3AE0A1717C; Tue, 28 Mar 2017 08:56:10 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 280481138651; Tue, 28 Mar 2017 10:56:08 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com A12E57AE85 Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=armbru@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com A12E57AE85 From: Markus Armbruster To: qemu-devel@nongnu.org Date: Tue, 28 Mar 2017 10:56:01 +0200 Message-Id: <1490691368-32099-4-git-send-email-armbru@redhat.com> In-Reply-To: <1490691368-32099-1-git-send-email-armbru@redhat.com> References: <1490691368-32099-1-git-send-email-armbru@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Tue, 28 Mar 2017 08:56:10 +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 v4 for-2.9 03/10] rbd: Don't limit length of parameter values 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: kwolf@redhat.com, jdurgin@redhat.com, qemu-block@nongnu.org, jcody@redhat.com, mreitz@redhat.com 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" We laboriously enforce that parameter values are between one and some arbitrary limit in length. Only RBD_MAX_IMAGE_NAME_SIZE comes from librbd.h, and I'm not sure it applies. Where the other limits come from is unclear. Drop the length checking. The limits librbd actually imposes must be checked by librbd anyway. There's one minor complication: BDRVRBDState member name is a fixed-size array. Depends on the length limit. Make it a pointer to a dynamically allocated string. Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake Reviewed-by: Max Reitz Reviewed-by: Jeff Cody --- block/rbd.c | 91 ++++++++++-----------------------------------------------= ---- 1 file changed, 14 insertions(+), 77 deletions(-) diff --git a/block/rbd.c b/block/rbd.c index 5ba2a87..0fea348 100644 --- a/block/rbd.c +++ b/block/rbd.c @@ -56,11 +56,6 @@ =20 #define OBJ_MAX_SIZE (1UL << OBJ_DEFAULT_OBJ_ORDER) =20 -#define RBD_MAX_CONF_NAME_SIZE 128 -#define RBD_MAX_CONF_VAL_SIZE 512 -#define RBD_MAX_CONF_SIZE 1024 -#define RBD_MAX_POOL_NAME_SIZE 128 -#define RBD_MAX_SNAP_NAME_SIZE 128 #define RBD_MAX_SNAPS 100 =20 /* The LIBRBD_SUPPORTS_IOVEC is defined in librbd.h */ @@ -99,16 +94,12 @@ typedef struct BDRVRBDState { rados_t cluster; rados_ioctx_t io_ctx; rbd_image_t image; - char name[RBD_MAX_IMAGE_NAME_SIZE]; + char *name; char *snap; } BDRVRBDState; =20 -static char *qemu_rbd_next_tok(int max_len, - char *src, char delim, - const char *name, - char **p, Error **errp) +static char *qemu_rbd_next_tok(char *src, char delim, char **p) { - int l; char *end; =20 *p =3D NULL; @@ -127,15 +118,6 @@ static char *qemu_rbd_next_tok(int max_len, *end =3D '\0'; } } - l =3D strlen(src); - if (l >=3D max_len) { - error_setg(errp, "%s too long", name); - return NULL; - } else if (l =3D=3D 0) { - error_setg(errp, "%s too short", name); - return NULL; - } - return src; } =20 @@ -159,7 +141,6 @@ static void qemu_rbd_parse_filename(const char *filenam= e, QDict *options, char *p, *buf, *keypairs; char *found_str; size_t max_keypair_size; - Error *local_err =3D NULL; =20 if (!strstart(filename, "rbd:", &start)) { error_setg(errp, "File name must start with 'rbd:'"); @@ -171,11 +152,7 @@ static void qemu_rbd_parse_filename(const char *filena= me, QDict *options, keypairs =3D g_malloc0(max_keypair_size); p =3D buf; =20 - found_str =3D qemu_rbd_next_tok(RBD_MAX_POOL_NAME_SIZE, p, - '/', "pool name", &p, &local_err); - if (local_err) { - goto done; - } + found_str =3D qemu_rbd_next_tok(p, '/', &p); if (!p) { error_setg(errp, "Pool name is required"); goto done; @@ -184,27 +161,15 @@ static void qemu_rbd_parse_filename(const char *filen= ame, QDict *options, qdict_put(options, "pool", qstring_from_str(found_str)); =20 if (strchr(p, '@')) { - found_str =3D qemu_rbd_next_tok(RBD_MAX_IMAGE_NAME_SIZE, p, - '@', "object name", &p, &local_err); - if (local_err) { - goto done; - } + found_str =3D qemu_rbd_next_tok(p, '@', &p); qemu_rbd_unescape(found_str); qdict_put(options, "image", qstring_from_str(found_str)); =20 - found_str =3D qemu_rbd_next_tok(RBD_MAX_SNAP_NAME_SIZE, p, - ':', "snap name", &p, &local_err); - if (local_err) { - goto done; - } + found_str =3D qemu_rbd_next_tok(p, ':', &p); qemu_rbd_unescape(found_str); qdict_put(options, "snapshot", qstring_from_str(found_str)); } else { - found_str =3D qemu_rbd_next_tok(RBD_MAX_IMAGE_NAME_SIZE, p, - ':', "object name", &p, &local_err); - if (local_err) { - goto done; - } + found_str =3D qemu_rbd_next_tok(p, ':', &p); qemu_rbd_unescape(found_str); qdict_put(options, "image", qstring_from_str(found_str)); } @@ -212,11 +177,7 @@ static void qemu_rbd_parse_filename(const char *filena= me, QDict *options, goto done; } =20 - found_str =3D qemu_rbd_next_tok(RBD_MAX_CONF_NAME_SIZE, p, - '\0', "configuration", &p, &local_err); - if (local_err) { - goto done; - } + found_str =3D qemu_rbd_next_tok(p, '\0', &p); =20 p =3D found_str; =20 @@ -224,12 +185,7 @@ static void qemu_rbd_parse_filename(const char *filena= me, QDict *options, * 'id' and 'conf' a bit special. Key/value pairs may be in any order= . */ while (p) { char *name, *value; - name =3D qemu_rbd_next_tok(RBD_MAX_CONF_NAME_SIZE, p, - '=3D', "conf option name", &p, &local_err= ); - if (local_err) { - break; - } - + name =3D qemu_rbd_next_tok(p, '=3D', &p); if (!p) { error_setg(errp, "conf option %s has no value", name); break; @@ -237,11 +193,7 @@ static void qemu_rbd_parse_filename(const char *filena= me, QDict *options, =20 qemu_rbd_unescape(name); =20 - value =3D qemu_rbd_next_tok(RBD_MAX_CONF_VAL_SIZE, p, - ':', "conf option value", &p, &local_err= ); - if (local_err) { - break; - } + value =3D qemu_rbd_next_tok(p, ':', &p); qemu_rbd_unescape(value); =20 if (!strcmp(name, "conf")) { @@ -274,9 +226,6 @@ static void qemu_rbd_parse_filename(const char *filenam= e, QDict *options, =20 =20 done: - if (local_err) { - error_propagate(errp, local_err); - } g_free(buf); g_free(keypairs); return; @@ -308,30 +257,20 @@ static int qemu_rbd_set_keypairs(rados_t cluster, con= st char *keypairs, char *p, *buf; char *name; char *value; - Error *local_err =3D NULL; int ret =3D 0; =20 buf =3D g_strdup(keypairs); p =3D buf; =20 while (p) { - name =3D qemu_rbd_next_tok(RBD_MAX_CONF_NAME_SIZE, p, - '=3D', "conf option name", &p, &local_err= ); - if (local_err) { - break; - } - + name =3D qemu_rbd_next_tok(p, '=3D', &p); if (!p) { error_setg(errp, "conf option %s has no value", name); ret =3D -EINVAL; break; } =20 - value =3D qemu_rbd_next_tok(RBD_MAX_CONF_VAL_SIZE, p, - ':', "conf option value", &p, &local_err= ); - if (local_err) { - break; - } + value =3D qemu_rbd_next_tok(p, ':', &p); =20 ret =3D rados_conf_set(cluster, name, value); if (ret < 0) { @@ -341,10 +280,6 @@ static int qemu_rbd_set_keypairs(rados_t cluster, cons= t char *keypairs, } } =20 - if (local_err) { - error_propagate(errp, local_err); - ret =3D -EINVAL; - } g_free(buf); return ret; } @@ -724,7 +659,7 @@ static int qemu_rbd_open(BlockDriverState *bs, QDict *o= ptions, int flags, } =20 s->snap =3D g_strdup(snap); - pstrcpy(s->name, RBD_MAX_IMAGE_NAME_SIZE, name); + s->name =3D g_strdup(name); =20 /* try default location when conf=3DNULL, but ignore failure */ r =3D rados_conf_read_file(s->cluster, conf); @@ -798,6 +733,7 @@ failed_open: failed_shutdown: rados_shutdown(s->cluster); g_free(s->snap); + g_free(s->name); failed_opts: qemu_opts_del(opts); g_free(mon_host); @@ -812,6 +748,7 @@ static void qemu_rbd_close(BlockDriverState *bs) rbd_close(s->image); rados_ioctx_destroy(s->io_ctx); g_free(s->snap); + g_free(s->name); rados_shutdown(s->cluster); } =20 --=20 2.7.4