From: Paolo Bonzini <pbonzini@redhat.com>
To: Dong Xu Wang <wdongxu@linux.vnet.ibm.com>
Cc: kwolf@redhat.com, lcapitulino@redhat.com, qemu-devel@nongnu.org,
armbru@redhat.com
Subject: Re: [Qemu-devel] [RFC v2 1/7] qemu-option: qemu_opt_set_bool(): fix code duplication
Date: Thu, 27 Sep 2012 13:55:18 +0200 [thread overview]
Message-ID: <50643EA6.10103@redhat.com> (raw)
In-Reply-To: <1348722865-20564-2-git-send-email-wdongxu@linux.vnet.ibm.com>
Il 27/09/2012 07:14, Dong Xu Wang ha scritto:
> Call qemu_opt_set() instead of duplicating opt_set().
>
> It will set opt->str in qemu_opt_set_bool, without opt->str, there
> will be some potential bugs.
>
> These are uses of opt->str, and what happens when it isn't set:
>
> * qemu_opt_get(): returns NULL, which means "not set". Bug can bite
> when value isn't the default value.
>
> * qemu_opt_parse(): passes NULL to parse_option_bool(), which treats it
> like "on". Wrong if the value is actually false. Bug can bite when
> qemu_opts_validate() runs after qemu_opt_set_bool().
>
> * qemu_opt_del(): passes NULL to g_free(), which is just fine.
>
> * qemu_opt_foreach(): passes NULL to the callback, which is unlikely to
> be prepared for it.
>
> * qemu_opts_print(): prints NULL, which crashes on some systems.
>
> * qemu_opts_to_qdict(): passes NULL to qstring_from_str(), which
> crashes.
>
> Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
> Signed-off-by: Dong Xu Wang <wdongxu@linux.vnet.ibm.com>
> ---
> qemu-option.c | 28 +---------------------------
> 1 files changed, 1 insertions(+), 27 deletions(-)
>
> diff --git a/qemu-option.c b/qemu-option.c
> index 27891e7..0b81e77 100644
> --- a/qemu-option.c
> +++ b/qemu-option.c
> @@ -667,33 +667,7 @@ void qemu_opt_set_err(QemuOpts *opts, const char *name, const char *value,
>
> int qemu_opt_set_bool(QemuOpts *opts, const char *name, bool val)
> {
> - QemuOpt *opt;
> - const QemuOptDesc *desc = opts->list->desc;
> - int i;
> -
> - for (i = 0; desc[i].name != NULL; i++) {
> - if (strcmp(desc[i].name, name) == 0) {
> - break;
> - }
> - }
> - if (desc[i].name == NULL) {
> - if (i == 0) {
> - /* empty list -> allow any */;
> - } else {
> - qerror_report(QERR_INVALID_PARAMETER, name);
> - return -1;
> - }
> - }
> -
> - opt = g_malloc0(sizeof(*opt));
> - opt->name = g_strdup(name);
> - opt->opts = opts;
> - QTAILQ_INSERT_TAIL(&opts->head, opt, next);
> - if (desc[i].name != NULL) {
> - opt->desc = desc+i;
> - }
> - opt->value.boolean = !!val;
> - return 0;
> + return qemu_opt_set(opts, name, val ? "on" : "off");
This now calls qemu_opt_parse, which won't work if you have opt->desc =
NULL.
Instead of this patch, using the new functions you create in patch 2
should be enough to limit the code duplication in qemu_opt_set_bool.
Paolo
> }
>
> int qemu_opt_foreach(QemuOpts *opts, qemu_opt_loopfunc func, void *opaque,
>
next prev parent reply other threads:[~2012-09-27 11:55 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-09-27 5:14 [Qemu-devel] [RFC v2 0/7] replace QEMUOptionParameter with QemuOpts parser Dong Xu Wang
2012-09-27 5:14 ` [Qemu-devel] [RFC v2 1/7] qemu-option: qemu_opt_set_bool(): fix code duplication Dong Xu Wang
2012-09-27 11:55 ` Paolo Bonzini [this message]
2012-09-27 5:14 ` [Qemu-devel] [RFC v2 2/7] qemu-option: opt_set(): split it up into more functions Dong Xu Wang
2012-09-27 5:14 ` [Qemu-devel] [RFC v2 3/7] qemu-option: qemu_opts_validate(): fix duplicated code Dong Xu Wang
2012-09-27 5:14 ` [Qemu-devel] [RFC v2 4/7] introduce qemu_opts_create_nofail function Dong Xu Wang
2012-09-27 5:14 ` [Qemu-devel] [RFC v2 5/7] use qemu_opts_create_nofail Dong Xu Wang
2012-09-27 5:14 ` [Qemu-devel] [RFC v2 6/7] create new function: qemu_opt_set_number Dong Xu Wang
2012-09-27 11:56 ` Paolo Bonzini
2012-09-27 5:14 ` [Qemu-devel] [RFC v2 7/7] remove QEMUOptionParameter Dong Xu Wang
2012-09-27 12:03 ` Paolo Bonzini
2012-09-28 6:42 ` Dong Xu Wang
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=50643EA6.10103@redhat.com \
--to=pbonzini@redhat.com \
--cc=armbru@redhat.com \
--cc=kwolf@redhat.com \
--cc=lcapitulino@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=wdongxu@linux.vnet.ibm.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.