From: "Benoît Canet" <benoit.canet@irqsave.net>
To: Kevin Wolf <kwolf@redhat.com>
Cc: benoit.canet@irqsave.net, qemu-devel@nongnu.org,
stefanha@redhat.com, armbru@redhat.com
Subject: Re: [Qemu-devel] [PATCH] block: Validate node-name
Date: Wed, 17 Sep 2014 15:29:25 +0200 [thread overview]
Message-ID: <20140917132925.GA15350@irqsave.net> (raw)
In-Reply-To: <1410953466-26543-1-git-send-email-kwolf@redhat.com>
The Wednesday 17 Sep 2014 à 13:31:06 (+0200), Kevin Wolf wrote :
> The device_name of a BlockDriverState is currently checked because it is
> always used as a QemuOpts ID and qemu_opts_create() checks whether such
> IDs are wellformed.
>
> node-name is supposed to share the same namespace, but it isn't checked
> currently. This patch adds explicit checks both for device_name and
> node-name so that the same rules will still apply even if QemuOpts won't
> be used any more at some point.
>
> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> ---
> block.c | 16 +++++++++++++---
> include/qemu/option.h | 1 +
> util/qemu-option.c | 4 ++--
> 3 files changed, 16 insertions(+), 5 deletions(-)
>
> diff --git a/block.c b/block.c
> index e144fd5..bddf1a0 100644
> --- a/block.c
> +++ b/block.c
> @@ -335,12 +335,22 @@ void bdrv_register(BlockDriver *bdrv)
> QLIST_INSERT_HEAD(&bdrv_drivers, bdrv, list);
> }
>
> +static bool bdrv_is_valid_name(const char *name)
> +{
> + return qemu_opts_id_wellformed(name);
> +}
> +
> /* create a new block device (by default it is empty) */
> BlockDriverState *bdrv_new(const char *device_name, Error **errp)
> {
> BlockDriverState *bs;
> int i;
>
> + if (*device_name && !bdrv_is_valid_name(device_name)) {
> + error_setg(errp, "Invalid device name");
> + return NULL;
> + }
> +
> if (bdrv_find(device_name)) {
> error_setg(errp, "Device with id '%s' already exists",
> device_name);
> @@ -903,9 +913,9 @@ static void bdrv_assign_node_name(BlockDriverState *bs,
> return;
> }
>
> - /* empty string node name is invalid */
> - if (node_name[0] == '\0') {
> - error_setg(errp, "Empty node name");
> + /* Check for empty string or invalid characters */
> + if (!bdrv_is_valid_name(node_name)) {
> + error_setg(errp, "Invalid node name");
> return;
> }
>
> diff --git a/include/qemu/option.h b/include/qemu/option.h
> index 59bea75..945347c 100644
> --- a/include/qemu/option.h
> +++ b/include/qemu/option.h
> @@ -103,6 +103,7 @@ typedef int (*qemu_opt_loopfunc)(const char *name, const char *value, void *opaq
> int qemu_opt_foreach(QemuOpts *opts, qemu_opt_loopfunc func, void *opaque,
> int abort_on_failure);
>
> +int qemu_opts_id_wellformed(const char *id);
> QemuOpts *qemu_opts_find(QemuOptsList *list, const char *id);
> QemuOpts *qemu_opts_create(QemuOptsList *list, const char *id,
> int fail_if_exists, Error **errp);
> diff --git a/util/qemu-option.c b/util/qemu-option.c
> index 6dc27ce..0cf9960 100644
> --- a/util/qemu-option.c
> +++ b/util/qemu-option.c
> @@ -641,7 +641,7 @@ QemuOpts *qemu_opts_find(QemuOptsList *list, const char *id)
> return NULL;
> }
>
> -static int id_wellformed(const char *id)
> +int qemu_opts_id_wellformed(const char *id)
> {
> int i;
>
> @@ -662,7 +662,7 @@ QemuOpts *qemu_opts_create(QemuOptsList *list, const char *id,
> QemuOpts *opts = NULL;
>
> if (id) {
> - if (!id_wellformed(id)) {
> + if (!qemu_opts_id_wellformed(id)) {
> error_set(errp,QERR_INVALID_PARAMETER_VALUE, "id", "an identifier");
> #if 0 /* conversion from qerror_report() to error_set() broke this: */
> error_printf_unless_qmp("Identifiers consist of letters, digits, '-', '.', '_', starting with a letter.\n");
> --
> 1.8.3.1
>
Reviewed-by: Benoit Canet <benoit.canet@nodalink.com>
next prev parent reply other threads:[~2014-09-17 13:30 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-09-17 11:31 [Qemu-devel] [PATCH] block: Validate node-name Kevin Wolf
2014-09-17 11:49 ` Benoît Canet
2014-09-17 12:28 ` Kevin Wolf
2014-09-18 7:50 ` Markus Armbruster
2014-09-17 13:29 ` Benoît Canet [this message]
2014-09-19 10:08 ` Stefan Hajnoczi
2014-09-19 13:21 ` Stefan Hajnoczi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20140917132925.GA15350@irqsave.net \
--to=benoit.canet@irqsave.net \
--cc=armbru@redhat.com \
--cc=kwolf@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.