qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Luiz Capitulino <lcapitulino@redhat.com>
To: Markus Armbruster <armbru@redhat.com>
Cc: jan.kiszka@siemens.com, aliguori@us.ibm.com,
	qemu-devel@nongnu.org, afaerber@suse.de
Subject: Re: [Qemu-devel] [PATCH 1/8] qemu-option: qemu_opt_set_bool(): fix code duplication
Date: Mon, 23 Jul 2012 16:46:37 -0300	[thread overview]
Message-ID: <20120723164637.01863346@doriath.home> (raw)
In-Reply-To: <87y5ma1h14.fsf@blackfin.pond.sub.org>

On Mon, 23 Jul 2012 20:14:31 +0200
Markus Armbruster <armbru@redhat.com> wrote:

> Luiz Capitulino <lcapitulino@redhat.com> writes:
> 
> > On Sat, 21 Jul 2012 10:09:09 +0200
> > Markus Armbruster <armbru@redhat.com> wrote:
> >
> >> Luiz Capitulino <lcapitulino@redhat.com> writes:
> >> 
> >> > Call qemu_opt_set() instead of duplicating opt_set().
> >> >
> >> > Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
> >> > ---
> >> >  qemu-option.c | 28 +---------------------------
> >> >  1 file changed, 1 insertion(+), 27 deletions(-)
> >> >
> >> > diff --git a/qemu-option.c b/qemu-option.c
> >> > index bb3886c..2cb2835 100644
> >> > --- a/qemu-option.c
> >> > +++ b/qemu-option.c
> >> > @@ -677,33 +677,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");
> >> >  }
> >> >  
> >> >  int qemu_opt_foreach(QemuOpts *opts, qemu_opt_loopfunc func, void *opaque,
> >> 
> >> Does a bit more than just obvious code de-duplication.  Two things in
> >> particular:
> >> 
> >> * Error reporting
> >> 
> >>   Old: qerror_report(); return -1
> >> 
> >>   New: opt_set() and qemu_opt_set() cooperate, like this:
> >>        opt_set(): error_set(); return;
> >>        qemu_opt_set():
> >>             if (error_is_set(&local_err)) {
> >>                 qerror_report_err(local_err);
> >>                 error_free(local_err);
> >>                 return -1;
> >>             }
> >> 
> >>   I guess the net effect is the same.  Not sure it's worth mentioning in
> >>   the commit message.
> >
> > The end result of calling qemu_opt_set_bool() is the same. The difference
> > between qerror_report() and qerror_report_err() is that the former gets error
> > information from the error call, while the latter gets error information
> > from the Error object. But they do the same thing.
> >
> >> * New sets opt->str to either "on" or "off" depending on val, then lets
> >>   reconstructs the value with qemu_opt_parse().  Which can't fail then.
> >>   I figure the latter part has no further impact.  But what about
> >>   setting opt->str?  Is this a bug fix?
> >
> > I don't remember if opt->str is read after the QemuOpt object is built. If
> > it's, then yes, this is a bug fix. Otherwise it just make the final
> > QemuOpt object more 'conforming'.
> 
> 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.

Thanks for the clarification.

> 
> Right now, the only use of qemu_opt_set_bool() is the one in vl.c.
> Can't see how to break it, but I didn't look hard.
> 
> I recommend to document the bug fix in the commit message.

Ok, will do.

  reply	other threads:[~2012-07-23 19:46 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-07-13 20:44 [Qemu-devel] [PATCH v2 0/8]: rename machine options to use dashes Luiz Capitulino
2012-07-13 20:44 ` [Qemu-devel] [PATCH 1/8] qemu-option: qemu_opt_set_bool(): fix code duplication Luiz Capitulino
2012-07-21  8:09   ` Markus Armbruster
2012-07-23 16:10     ` Luiz Capitulino
2012-07-23 18:14       ` Markus Armbruster
2012-07-23 19:46         ` Luiz Capitulino [this message]
2012-07-13 20:44 ` [Qemu-devel] [PATCH 2/8] qemu-option: opt_set(): split it up into more functions Luiz Capitulino
2012-07-13 20:44 ` [Qemu-devel] [PATCH 3/8] qemu-option: qemu_opts_validate(): fix duplicated code Luiz Capitulino
2012-07-13 20:44 ` [Qemu-devel] [PATCH 4/8] qemu-option: add alias support Luiz Capitulino
2012-07-21  8:11   ` Markus Armbruster
2012-07-23 16:17     ` Luiz Capitulino
2012-07-23 18:33       ` Markus Armbruster
2012-07-23 20:00         ` Luiz Capitulino
2012-07-24  9:19           ` Markus Armbruster
2012-07-24 15:15             ` Luiz Capitulino
2012-07-24 16:01               ` Markus Armbruster
2012-07-25 12:36                 ` Luiz Capitulino
2012-07-13 20:44 ` [Qemu-devel] [PATCH 5/8] machine: rename kernel_irqchip to kernel-irqchip Luiz Capitulino
2012-07-13 20:44 ` [Qemu-devel] [PATCH 6/8] machine: rename kvm_shadow_mem to kvm-shadow-mem Luiz Capitulino
2012-07-13 20:44 ` [Qemu-devel] [PATCH 7/8] machine: rename phandle_start to phandle-start Luiz Capitulino
2012-07-13 20:44 ` [Qemu-devel] [PATCH 8/8] machine: rename dt_compatible to dt-compatible Luiz Capitulino

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=20120723164637.01863346@doriath.home \
    --to=lcapitulino@redhat.com \
    --cc=afaerber@suse.de \
    --cc=aliguori@us.ibm.com \
    --cc=armbru@redhat.com \
    --cc=jan.kiszka@siemens.com \
    --cc=qemu-devel@nongnu.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).