All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Daniel P. Berrange" <berrange@redhat.com>
To: Markus Armbruster <armbru@redhat.com>
Cc: qemu-devel@nongnu.org, eblake@redhat.com
Subject: Re: [Qemu-devel] [PATCH for-2.6 3/3] qom: -object error messages lost location, restore it
Date: Wed, 27 Apr 2016 15:49:40 +0100	[thread overview]
Message-ID: <20160427144940.GF17937@redhat.com> (raw)
In-Reply-To: <1461767349-15329-4-git-send-email-armbru@redhat.com>

On Wed, Apr 27, 2016 at 04:29:09PM +0200, Markus Armbruster wrote:
> qemu_opts_foreach() runs its callback with the error location set to
> the option's location.  Any errors the callback reports use the
> option's location automatically.
> 
> Commit 90998d5 moved the actual error reporting from "inside"
> qemu_opts_foreach() to after it.  Here's a typical hunk:
> 
> 	 if (qemu_opts_foreach(qemu_find_opts("object"),
>     -                          object_create,
>     -                          object_create_initial, NULL)) {
>     +                          user_creatable_add_opts_foreach,
>     +                          object_create_initial, &err)) {
>     +        error_report_err(err);
> 	     exit(1);
> 	 }
> 
> Before, object_create() reports from within qemu_opts_foreach(), using
> the option's location.  Afterwards, we do it after
> qemu_opts_foreach(), using whatever location happens to be current.
> Commonly a "none" location.

IMHO this shows a major design flaw with error_report_err() method
and the location handling. The design pattern we have for "Error *"
objects is that we can freely propagate them up the caller, because
it is a self-contained record of the error information. As soon as
you do that you loose the location information, because it was not
in fact associated with the Error, but rather stored in a single
global variable. For that matter, the Location info isn't even
thread safe AFAICT since its a simple state var, so you better hope
that there's no code which calls loc_push/pop from a non-main thread :-(

> 
> Reproducer:
> 
>     $ qemu-system-x86_64 -nodefaults -display none -object secret,id=foo,foo=bar
>     qemu-system-x86_64: Property '.foo' not found
> 
> Note no location.  This commit restores it:
> 
>     qemu-system-x86_64: -object secret,id=foo,foo=bar: Property '.foo' not found
> 
> Note that the qemu_opts_foreach() bug just fixed could mask the bug
> here: if the location it leaves dandling hasn't been clobbered, yet,
> it's the correct one.
> 
> Reported-by: Eric Blake <eblake@redhat.com>
> Cc: Daniel P. Berrange <berrange@redhat.com>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>  include/qom/object_interfaces.h |  5 +++--
>  qemu-img.c                      | 39 +++++++++++----------------------------
>  qemu-io.c                       |  3 +--
>  qemu-nbd.c                      |  3 +--
>  qom/object_interfaces.c         |  4 +++-
>  vl.c                            |  6 ++----
>  6 files changed, 21 insertions(+), 39 deletions(-)
> 
> diff --git a/include/qom/object_interfaces.h b/include/qom/object_interfaces.h
> index d579746..8b17f4d 100644
> --- a/include/qom/object_interfaces.h
> +++ b/include/qom/object_interfaces.h
> @@ -140,7 +140,7 @@ typedef bool (*user_creatable_add_opts_predicate)(const char *type);
>   * user_creatable_add_opts_foreach:
>   * @opaque: a user_creatable_add_opts_predicate callback or NULL
>   * @opts: options to create
> - * @errp: if an error occurs, a pointer to an area to store the error
> + * @errp: unused
>   *
>   * An iterator callback to be used in conjunction with
>   * the qemu_opts_foreach() method for creating a list of
> @@ -148,8 +148,9 @@ typedef bool (*user_creatable_add_opts_predicate)(const char *type);
>   *
>   * The @opaque parameter can be passed a user_creatable_add_opts_predicate
>   * callback to filter which types of object are created during iteration.
> + * When it fails, report the error.
>   *
> - * Returns: 0 on success, -1 on error
> + * Returns: 0 on success, -1 when an error was reported.
>   */
>  int user_creatable_add_opts_foreach(void *opaque,
>                                      QemuOpts *opts, Error **errp);
> diff --git a/qemu-img.c b/qemu-img.c
> index 1697762..46f2a6d 100644
> --- a/qemu-img.c
> +++ b/qemu-img.c
> @@ -435,8 +435,7 @@ static int img_create(int argc, char **argv)
>  
>      if (qemu_opts_foreach(&qemu_object_opts,
>                            user_creatable_add_opts_foreach,
> -                          NULL, &local_err)) {
> -        error_report_err(local_err);
> +                          NULL, NULL)) {
>          goto fail;
>      }
>  
> @@ -598,7 +597,6 @@ static int img_check(int argc, char **argv)
>      bool writethrough;
>      ImageCheck *check;
>      bool quiet = false;
> -    Error *local_err = NULL;
>      bool image_opts = false;
>  
>      fmt = NULL;
> @@ -679,8 +677,7 @@ static int img_check(int argc, char **argv)
>  
>      if (qemu_opts_foreach(&qemu_object_opts,
>                            user_creatable_add_opts_foreach,
> -                          NULL, &local_err)) {
> -        error_report_err(local_err);
> +                          NULL, NULL)) {
>          return 1;
>      }
>  
> @@ -871,8 +868,7 @@ static int img_commit(int argc, char **argv)
>  
>      if (qemu_opts_foreach(&qemu_object_opts,
>                            user_creatable_add_opts_foreach,
> -                          NULL, &local_err)) {
> -        error_report_err(local_err);
> +                          NULL, NULL)) {
>          return 1;
>      }
>  
> @@ -1133,7 +1129,6 @@ static int img_compare(int argc, char **argv)
>      int64_t nb_sectors;
>      int c, pnum;
>      uint64_t progress_base;
> -    Error *local_err = NULL;
>      bool image_opts = false;
>  
>      cache = BDRV_DEFAULT_CACHE;
> @@ -1201,8 +1196,7 @@ static int img_compare(int argc, char **argv)
>  
>      if (qemu_opts_foreach(&qemu_object_opts,
>                            user_creatable_add_opts_foreach,
> -                          NULL, &local_err)) {
> -        error_report_err(local_err);
> +                          NULL, NULL)) {
>          ret = 2;
>          goto out4;
>      }
> @@ -1864,8 +1858,7 @@ static int img_convert(int argc, char **argv)
>  
>      if (qemu_opts_foreach(&qemu_object_opts,
>                            user_creatable_add_opts_foreach,
> -                          NULL, &local_err)) {
> -        error_report_err(local_err);
> +                          NULL, NULL)) {
>          goto fail_getopt;
>      }
>  
> @@ -2299,7 +2292,6 @@ static int img_info(int argc, char **argv)
>      bool chain = false;
>      const char *filename, *fmt, *output;
>      ImageInfoList *list;
> -    Error *local_err = NULL;
>      bool image_opts = false;
>  
>      fmt = NULL;
> @@ -2363,8 +2355,7 @@ static int img_info(int argc, char **argv)
>  
>      if (qemu_opts_foreach(&qemu_object_opts,
>                            user_creatable_add_opts_foreach,
> -                          NULL, &local_err)) {
> -        error_report_err(local_err);
> +                          NULL, NULL)) {
>          return 1;
>      }
>  
> @@ -2513,7 +2504,6 @@ static int img_map(int argc, char **argv)
>      int64_t length;
>      MapEntry curr = { .length = 0 }, next;
>      int ret = 0;
> -    Error *local_err = NULL;
>      bool image_opts = false;
>  
>      fmt = NULL;
> @@ -2573,8 +2563,7 @@ static int img_map(int argc, char **argv)
>  
>      if (qemu_opts_foreach(&qemu_object_opts,
>                            user_creatable_add_opts_foreach,
> -                          NULL, &local_err)) {
> -        error_report_err(local_err);
> +                          NULL, NULL)) {
>          return 1;
>      }
>  
> @@ -2717,8 +2706,7 @@ static int img_snapshot(int argc, char **argv)
>  
>      if (qemu_opts_foreach(&qemu_object_opts,
>                            user_creatable_add_opts_foreach,
> -                          NULL, &err)) {
> -        error_report_err(err);
> +                          NULL, NULL)) {
>          return 1;
>      }
>  
> @@ -2867,8 +2855,7 @@ static int img_rebase(int argc, char **argv)
>  
>      if (qemu_opts_foreach(&qemu_object_opts,
>                            user_creatable_add_opts_foreach,
> -                          NULL, &local_err)) {
> -        error_report_err(local_err);
> +                          NULL, NULL)) {
>          return 1;
>      }
>  
> @@ -3133,7 +3120,6 @@ static int img_resize(int argc, char **argv)
>      bool quiet = false;
>      BlockBackend *blk = NULL;
>      QemuOpts *param;
> -    Error *local_err = NULL;
>  
>      static QemuOptsList resize_options = {
>          .name = "resize_options",
> @@ -3204,8 +3190,7 @@ static int img_resize(int argc, char **argv)
>  
>      if (qemu_opts_foreach(&qemu_object_opts,
>                            user_creatable_add_opts_foreach,
> -                          NULL, &local_err)) {
> -        error_report_err(local_err);
> +                          NULL, NULL)) {
>          return 1;
>      }
>  
> @@ -3297,7 +3282,6 @@ static int img_amend(int argc, char **argv)
>      bool quiet = false, progress = false;
>      BlockBackend *blk = NULL;
>      BlockDriverState *bs = NULL;
> -    Error *local_err = NULL;
>      bool image_opts = false;
>  
>      cache = BDRV_DEFAULT_CACHE;
> @@ -3365,8 +3349,7 @@ static int img_amend(int argc, char **argv)
>  
>      if (qemu_opts_foreach(&qemu_object_opts,
>                            user_creatable_add_opts_foreach,
> -                          NULL, &local_err)) {
> -        error_report_err(local_err);
> +                          NULL, NULL)) {
>          ret = -1;
>          goto out_no_progress;
>      }
> diff --git a/qemu-io.c b/qemu-io.c
> index 288bba8..0598251 100644
> --- a/qemu-io.c
> +++ b/qemu-io.c
> @@ -534,8 +534,7 @@ int main(int argc, char **argv)
>  
>      if (qemu_opts_foreach(&qemu_object_opts,
>                            user_creatable_add_opts_foreach,
> -                          NULL, &local_error)) {
> -        error_report_err(local_error);
> +                          NULL, NULL)) {
>          exit(1);
>      }
>  
> diff --git a/qemu-nbd.c b/qemu-nbd.c
> index 2c9754e..c55b40f 100644
> --- a/qemu-nbd.c
> +++ b/qemu-nbd.c
> @@ -711,8 +711,7 @@ int main(int argc, char **argv)
>  
>      if (qemu_opts_foreach(&qemu_object_opts,
>                            user_creatable_add_opts_foreach,
> -                          NULL, &local_err)) {
> -        error_report_err(local_err);
> +                          NULL, NULL)) {
>          exit(EXIT_FAILURE);
>      }
>  
> diff --git a/qom/object_interfaces.c b/qom/object_interfaces.c
> index ab5da35..3931890 100644
> --- a/qom/object_interfaces.c
> +++ b/qom/object_interfaces.c
> @@ -170,6 +170,7 @@ int user_creatable_add_opts_foreach(void *opaque, QemuOpts *opts, Error **errp)
>  {
>      bool (*type_predicate)(const char *) = opaque;
>      Object *obj = NULL;
> +    Error *err = NULL;
>      const char *type;
>  
>      type = qemu_opt_get(opts, "qom-type");
> @@ -178,8 +179,9 @@ int user_creatable_add_opts_foreach(void *opaque, QemuOpts *opts, Error **errp)
>          return 0;
>      }
>  
> -    obj = user_creatable_add_opts(opts, errp);
> +    obj = user_creatable_add_opts(opts, &err);
>      if (!obj) {
> +        error_report_err(err);
>          return -1;
>      }
>      object_unref(obj);
> diff --git a/vl.c b/vl.c
> index 9df534f..5fd22cb 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -4291,8 +4291,7 @@ int main(int argc, char **argv, char **envp)
>  
>      if (qemu_opts_foreach(qemu_find_opts("object"),
>                            user_creatable_add_opts_foreach,
> -                          object_create_initial, &err)) {
> -        error_report_err(err);
> +                          object_create_initial, NULL)) {
>          exit(1);
>      }
>  
> @@ -4410,8 +4409,7 @@ int main(int argc, char **argv, char **envp)
>  
>      if (qemu_opts_foreach(qemu_find_opts("object"),
>                            user_creatable_add_opts_foreach,
> -                          object_create_delayed, &err)) {
> -        error_report_err(err);
> +                          object_create_delayed, NULL)) {
>          exit(1);
>      }

Very reluctant

 Reviewed-by: Daniel P. Berrange <berrange@redhat.com>

this really needs fixing properly in 2.7 so that the Error object is
fully self contained so that later use of it does not rely on any
global state.


Regards,
Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|

  reply	other threads:[~2016-04-27 14:49 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-04-27 14:29 [Qemu-devel] [PATCH for-2.6 0/3] Fix dangling pointers and error message regressions Markus Armbruster
2016-04-27 14:29 ` [Qemu-devel] [PATCH for-2.6 1/3] QemuOpts: Fix qemu_opts_foreach() dangling location regression Markus Armbruster
2016-04-27 14:42   ` Eric Blake
2016-04-27 14:29 ` [Qemu-devel] [PATCH for-2.6 2/3] replay: Fix dangling location bug in replay_configure() Markus Armbruster
2016-04-27 14:57   ` Eric Blake
2016-04-27 16:39   ` Eduardo Habkost
2016-04-27 14:29 ` [Qemu-devel] [PATCH for-2.6 3/3] qom: -object error messages lost location, restore it Markus Armbruster
2016-04-27 14:49   ` Daniel P. Berrange [this message]
2016-04-27 15:36     ` Markus Armbruster
2016-04-27 15:25   ` Eric Blake

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=20160427144940.GF17937@redhat.com \
    --to=berrange@redhat.com \
    --cc=armbru@redhat.com \
    --cc=eblake@redhat.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 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.