All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kevin Wolf <kwolf@redhat.com>
To: Markus Armbruster <armbru@redhat.com>
Cc: qemu-devel@nongnu.org, qemu-block@nongnu.org, mreitz@redhat.com
Subject: Re: [PATCH for-5.1 8/8] qemu-option: Move is_valid_option_list() to qemu-img.c and rewrite
Date: Tue, 14 Apr 2020 17:10:14 +0200	[thread overview]
Message-ID: <20200414151014.GM7747@linux.fritz.box> (raw)
In-Reply-To: <87blnup257.fsf@dusky.pond.sub.org>

Am 14.04.2020 um 16:34 hat Markus Armbruster geschrieben:
> Markus Armbruster <armbru@redhat.com> writes:
> 
> > Eric Blake <eblake@redhat.com> writes:
> >
> >> On 4/9/20 10:30 AM, Markus Armbruster wrote:
> >>> is_valid_option_list()'s purpose is ensuring qemu-img.c's can safely
> >>> join multiple parameter strings separated by ',' like this:
> >>>
> >>>          g_strdup_printf("%s,%s", params1, params2);
> >>>
> >>> How it does that is anything but obvious.  A close reading of the code
> >>> reveals that it fails exactly when its argument starts with ',' or
> >>> ends with an odd number of ','.  Makes sense, actually, because when
> >>> the argument starts with ',', a separating ',' preceding it would get
> >>> escaped, and when it ends with an odd number of ',', a separating ','
> >>> following it would get escaped.
> >>>
> >>> Move it to qemu-img.c and rewrite it the obvious way.
> >>>
> >>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> >>> ---
> >>>   include/qemu/option.h |  1 -
> >>>   qemu-img.c            | 26 ++++++++++++++++++++++++++
> >>>   util/qemu-option.c    | 22 ----------------------
> >>>   3 files changed, 26 insertions(+), 23 deletions(-)
> >>>
> >>
> >>> +++ b/qemu-img.c
> >>> @@ -223,6 +223,32 @@ static bool qemu_img_object_print_help(const char *type, QemuOpts *opts)
> >>>       return true;
> >>>   }
> >>>   +/*
> >>> + * Is @optarg safe for accumulate_options()?
> >>> + * It is when multiple of them can be joined together separated by ','.
> >>> + * To make that work, @optarg must not start with ',' (or else a
> >>> + * separating ',' preceding it gets escaped), and it must not end with
> >>> + * an odd number of ',' (or else a separating ',' following it gets
> >>> + * escaped).
> >>> + */
> >>> +static bool is_valid_option_list(const char *optarg)
> >>> +{
> >>> +    size_t len = strlen(optarg);
> >>> +    size_t i;
> >>> +
> >>> +    if (optarg[0] == ',') {
> >>> +        return false;
> >>> +    }
> >>> +
> >>> +    for (i = len; i > 0 && optarg[i - 1] == ','; i--) {
> >>> +    }
> >>> +    if ((len - i) % 2) {
> >>> +        return false;
> >>> +    }
> >>> +
> >>> +    return true;
> >>
> >> Okay, that's easy to read.  Note that is_valid_option_list("") returns
> >> true.
> >
> > Hmm, that's a bug:
> >
> >     $ qemu-img create -f qcow2 -o backing_file=a -o "" -o backing_fmt=raw,size=1M new.qcow2
> >     qemu-img: warning: Could not verify backing image. This may become an error in future versions.
> >     Could not open 'a,backing_fmt=raw': No such file or directory
> >     Formatting 'new.qcow2', fmt=qcow2 size=1048576 backing_file=a,,backing_fmt=raw cluster_size=65536 lazy_refcounts=off refcount_bits=16
> >     $ qemu-img info new.qcow2 
> >     image: new.qcow2
> >     file format: qcow2
> >     virtual size: 1 MiB (1048576 bytes)
> >     disk size: 196 KiB
> >     cluster_size: 65536
> > --> backing file: a,backing_fmt=raw
> >     Format specific information:
> >         compat: 1.1
> >         lazy refcounts: false
> >         refcount bits: 16
> >         corrupt: false
> >
> > My rewrite preserves this bug.  Will fix in v2.
> 
> Kevin, two obvious fixes:
> 
> * Make is_valid_option_list() reject -o ""
> 
> * Make accumulate_options(options, "") return options.
> 
> Got a preference?

In other words, the choice is between reporting an error and ignoring it
silently. I think reporting an error makes more sense.

Kevin



  reply	other threads:[~2020-04-14 17:04 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-04-09 15:30 [PATCH for-5.1 0/8] qemu-option: Fix corner cases and clean up Markus Armbruster
2020-04-09 15:30 ` [PATCH for-5.1 1/8] tests-qemu-opts: Cover has_help_option(), qemu_opt_has_help_opt() Markus Armbruster
2020-04-09 17:50   ` Eric Blake
2020-04-14  9:10     ` Markus Armbruster
2020-04-14 13:13       ` Kevin Wolf
2020-04-14 13:36         ` Markus Armbruster
2020-04-14 14:29           ` Kevin Wolf
2020-04-14 20:13             ` Markus Armbruster
2020-04-15 10:00               ` Kevin Wolf
2020-04-15 14:45                 ` Markus Armbruster
2020-04-09 15:30 ` [PATCH for-5.1 2/8] qemu-options: Factor out get_opt_name_value() helper Markus Armbruster
2020-04-09 18:01   ` Eric Blake
2020-04-14  9:42     ` Markus Armbruster
2020-04-14 14:05       ` Kevin Wolf
2020-04-15  7:03         ` Markus Armbruster
2020-04-14 14:05   ` Kevin Wolf
2020-04-09 15:30 ` [PATCH for-5.1 3/8] qemu-option: Fix sloppy recognition of "id=..." after ", , " Markus Armbruster
2020-04-09 18:05   ` Eric Blake
2020-04-14 14:44   ` [PATCH for-5.1 3/8] qemu-option: Fix sloppy recognition of "id=..." after ",," Kevin Wolf
2020-04-09 15:30 ` [PATCH for-5.1 4/8] qemu-option: Avoid has_help_option() in qemu_opts_parse_noisily() Markus Armbruster
2020-04-09 18:07   ` Eric Blake
2020-04-14 10:04     ` Markus Armbruster
2020-04-09 15:30 ` [PATCH for-5.1 5/8] qemu-option: Fix has_help_option()'s sloppy parsing Markus Armbruster
2020-04-09 18:10   ` Eric Blake
2020-04-14 10:16     ` Markus Armbruster
2020-04-14 14:57       ` Kevin Wolf
2020-04-15  7:48         ` Markus Armbruster
2020-04-09 15:30 ` [PATCH for-5.1 6/8] test-qemu-opts: Simplify test_has_help_option() after bug fix Markus Armbruster
2020-04-09 18:13   ` Eric Blake
2020-04-14 14:58   ` Kevin Wolf
2020-04-09 15:30 ` [PATCH for-5.1 7/8] qemu-img: Factor out accumulate_options() helper Markus Armbruster
2020-04-09 18:15   ` Eric Blake
2020-04-14 15:00   ` Kevin Wolf
2020-04-09 15:30 ` [PATCH for-5.1 8/8] qemu-option: Move is_valid_option_list() to qemu-img.c and rewrite Markus Armbruster
2020-04-09 19:45   ` Eric Blake
2020-04-14  8:47     ` Markus Armbruster
2020-04-14 14:34       ` Markus Armbruster
2020-04-14 15:10         ` Kevin Wolf [this message]
2020-04-14 20:14           ` Markus Armbruster
2020-04-09 17:09 ` [PATCH for-5.1 0/8] qemu-option: Fix corner cases and clean up no-reply
2020-04-09 17:44   ` Eric Blake
2020-04-14  8:52     ` Markus Armbruster

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=20200414151014.GM7747@linux.fritz.box \
    --to=kwolf@redhat.com \
    --cc=armbru@redhat.com \
    --cc=mreitz@redhat.com \
    --cc=qemu-block@nongnu.org \
    --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.