From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:56784) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1THCgn-00073r-6F for qemu-devel@nongnu.org; Thu, 27 Sep 2012 07:55:39 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1THCgg-0004KR-O5 for qemu-devel@nongnu.org; Thu, 27 Sep 2012 07:55:33 -0400 Received: from mail-pb0-f45.google.com ([209.85.160.45]:53228) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1THCgg-0004KG-Hk for qemu-devel@nongnu.org; Thu, 27 Sep 2012 07:55:26 -0400 Received: by pbbrp2 with SMTP id rp2so3492670pbb.4 for ; Thu, 27 Sep 2012 04:55:25 -0700 (PDT) Sender: Paolo Bonzini Message-ID: <50643EA6.10103@redhat.com> Date: Thu, 27 Sep 2012 13:55:18 +0200 From: Paolo Bonzini MIME-Version: 1.0 References: <1348722865-20564-1-git-send-email-wdongxu@linux.vnet.ibm.com> <1348722865-20564-2-git-send-email-wdongxu@linux.vnet.ibm.com> In-Reply-To: <1348722865-20564-2-git-send-email-wdongxu@linux.vnet.ibm.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [RFC v2 1/7] qemu-option: qemu_opt_set_bool(): fix code duplication List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Dong Xu Wang Cc: kwolf@redhat.com, lcapitulino@redhat.com, qemu-devel@nongnu.org, armbru@redhat.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 > Signed-off-by: Dong Xu Wang > --- > 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, >