All of lore.kernel.org
 help / color / mirror / Atom feed
From: Eric Blake <eblake@redhat.com>
To: Kevin Wolf <kwolf@redhat.com>, qemu-devel@nongnu.org
Cc: lvivier@redhat.com, thuth@redhat.com, pkrempa@redhat.com,
	ehabkost@redhat.com, qemu-block@nongnu.org,
	libvir-list@redhat.com, jasowang@redhat.com, dgilbert@redhat.com,
	mreitz@redhat.com, kraxel@redhat.com, pbonzini@redhat.com
Subject: Re: [PATCH v2 25/31] qemu-img: Use user_creatable_process_cmdline() for --object
Date: Fri, 26 Feb 2021 16:17:25 -0600	[thread overview]
Message-ID: <d0bec2d3-ee92-a3c8-d39a-c2569ac433b6@redhat.com> (raw)
In-Reply-To: <d4b18317-89e0-cfb1-d9a2-046e94f5d8f7@redhat.com>

On 2/26/21 3:56 PM, Eric Blake wrote:
> On 2/24/21 7:52 AM, Kevin Wolf wrote:
>> This switches qemu-img from a QemuOpts-based parser for --object to
>> user_creatable_process_cmdline() which uses a keyval parser and enforces
>> the QAPI schema.
>>
>> Apart from being a cleanup, this makes non-scalar properties accessible.
>>
>> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
>> ---
>>  qemu-img.c | 239 ++++++++---------------------------------------------
>>  1 file changed, 33 insertions(+), 206 deletions(-)
>>
> 
>> @@ -1423,15 +1373,9 @@ static int img_compare(int argc, char **argv)
>>          case 'U':
>>              force_share = true;
>>              break;
>> -        case OPTION_OBJECT: {
>> -            QemuOpts *opts;
>> -            opts = qemu_opts_parse_noisily(&qemu_object_opts,
>> -                                           optarg, true);
>> -            if (!opts) {
>> -                ret = 2;
>> -                goto out4;
> 
> Our exit status here of 2 on failure appears to be intentional (since we
> reserve 0 for identical, 1 for mismatch, >1 for error)...
> 
>> -            }
>> -        }   break;
>> +        case OPTION_OBJECT:
>> +            user_creatable_process_cmdline(optarg);
>> +            break;
> 
> ...but becomes 1 here.  Does that matter?
> 
> /me goes and tests...
> 
> Ouch: with current qemu.git master and none of this series applied:
> 
> $ ./qemu-img compare --object foo,id=x /dev/null /dev/null
> qemu-img: invalid object type: foo
> $ echo $?
> 1

Okay, that didn't do what I expected, but this does:

$ ./qemu-img compare --object foo,id=1 /dev/null /dev/null
qemu-img: Parameter 'id' expects an identifier
Identifiers consist of letters, digits, '-', '.', '_', starting with a
letter.
$ echo $?
2

> $ gdb --args ./qemu-img compare --object foo,id=x /dev/null /dev/null
> (gdb) b qemu_opts_pars
> (gdb) r
> (gdb) fin
> Run till exit from #0  qemu_opts_parse_noisily (
>     list=0x55555578f020 <qemu_object_opts>, params=0x7fffffffd8a8
> "foo,id=x",
>     permit_abbrev=true) at ../util/qemu-option.c:948
> 0x00005555555805f9 in img_compare (argc=5, argv=0x7fffffffd480)
>     at ../qemu-img.c:1428
> 1428	            opts = qemu_opts_parse_noisily(&qemu_object_opts,
> Value returned is $1 = (QemuOpts *) 0x55555583b4b0
> (gdb) p *opts
> $3 = {id = 0x5555557a0d58 <qemu_trace_opts+24> "`\264\203UUU", list = 0x51,

and this may be my confusion with gdb.  Right after 'fin', *opts is not
the same as *$1 (apparently gdb has stopped at a point where the 'opts'
currently in scope is not the opts set by qemu_opts_parse_noisily, but
before the opts in scope has actually been assigned the returned value).

> 
> That looks buggy.  qemu_opts_parse_noisily() is NOT returning NULL, but
> rather a pointer to something garbage (that id pointing to a garbage
> string in the middle of qemu_trace_opts is fishy), and so we've been
> exiting with status 1 in spite of the code.
> 
> Looks like we'll want a separate patch fixing that first.

So I was wrong on when qemu_opts_parse_noisily() returns NULL - it does
NOT reject unknown object names (that was the job of the
qemu_opts_foreach call later), but merely rejects bad/duplicate ids.
Thus this code was indeed giving an exit status of 2 when actually
triggered correctly,

> 
>>          case OPTION_IMAGE_OPTS:
>>              image_opts = true;
>>              break;
>> @@ -1450,13 +1394,6 @@ static int img_compare(int argc, char **argv)
>>      filename1 = argv[optind++];
>>      filename2 = argv[optind++];
>>  
>> -    if (qemu_opts_foreach(&qemu_object_opts,
>> -                          user_creatable_add_opts_foreach,
>> -                          qemu_img_object_print_help, &error_fatal)) {
>> -        ret = 2;
>> -        goto out4;
> 
> Same deal with return value.  Except here we used &error_fatal (which
> forces an exit status of 1 rather than returning), and so never even
> reach the ret=2 code.  Looks like we broke that in commit 334c43e2c3,
> where we used to pass NULL instead of &error_fatal (although that commit
> was in turn fixing another problem).

...and THIS spot is why my original attempt to prove that your code was
causing a regression was seeing an exit status of 1, where I instead
ended up proving that we already regressed.

> 
> The rest of this patch looks fine, although maybe
> user_creatable_process_cmdline() should be given an 'int status'
> parameter for specifying 1 vs. 2 (or any other non-zero value) if we
> intend to fix the status of qemu-img compare failures.  (Thankfully,
> even though qemu-img check also has a variety of documented return
> values other than 1, at least it documented 1 as internal errors and was
> already using 1 for --object failures).
> 

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3226
Virtualization:  qemu.org | libvirt.org



  reply	other threads:[~2021-02-26 22:19 UTC|newest]

Thread overview: 82+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-24 13:52 [PATCH v2 00/31] qapi/qom: QAPIfy --object and object-add Kevin Wolf
2021-02-24 13:52 ` [PATCH v2 01/31] tests: Drop 'props' from object-add calls Kevin Wolf
2021-02-25 22:40   ` Eric Blake
2021-02-24 13:52 ` [PATCH v2 02/31] qapi/qom: Drop deprecated 'props' from object-add Kevin Wolf
2021-02-25 22:42   ` Eric Blake
2021-02-24 13:52 ` [PATCH v2 03/31] qapi/qom: Add ObjectOptions for iothread Kevin Wolf
2021-02-25 22:55   ` Eric Blake
2021-03-02 17:27     ` Kevin Wolf
2021-02-24 13:52 ` [PATCH v2 04/31] qapi/qom: Add ObjectOptions for authz-* Kevin Wolf
2021-02-26 14:02   ` Eric Blake
2021-02-24 13:52 ` [PATCH v2 05/31] qapi/qom: Add ObjectOptions for cryptodev-* Kevin Wolf
2021-02-26 14:36   ` Eric Blake
2021-02-24 13:52 ` [PATCH v2 06/31] qapi/qom: Add ObjectOptions for dbus-vmstate Kevin Wolf
2021-02-26 15:58   ` Eric Blake
2021-03-02 17:36     ` Kevin Wolf
2021-02-24 13:52 ` [PATCH v2 07/31] qapi/qom: Add ObjectOptions for memory-backend-* Kevin Wolf
2021-02-26 16:23   ` Eric Blake
2021-03-02 18:11     ` Kevin Wolf
2021-02-24 13:52 ` [PATCH v2 08/31] qapi/qom: Add ObjectOptions for rng-*, deprecate 'opened' Kevin Wolf
2021-02-26 16:54   ` Eric Blake
2021-02-24 13:52 ` [PATCH v2 09/31] qapi/qom: Add ObjectOptions for throttle-group Kevin Wolf
2021-02-26 17:26   ` Eric Blake
2021-03-02 18:18     ` Kevin Wolf
2021-02-24 13:52 ` [PATCH v2 10/31] qapi/qom: Add ObjectOptions for secret*, deprecate 'loaded' Kevin Wolf
2021-02-26 19:17   ` Eric Blake
2021-03-02 18:23     ` Kevin Wolf
2021-02-24 13:52 ` [PATCH v2 11/31] qapi/qom: Add ObjectOptions for tls-*, " Kevin Wolf
2021-02-26 19:33   ` Eric Blake
2021-03-02 18:27     ` Kevin Wolf
2021-02-24 13:52 ` [PATCH v2 12/31] qapi/qom: Add ObjectOptions for can-* Kevin Wolf
2021-02-26 19:42   ` Eric Blake
2021-03-02 18:32     ` Kevin Wolf
2021-03-02 20:03       ` Eric Blake
2021-02-24 13:52 ` [PATCH v2 13/31] qapi/qom: Add ObjectOptions for colo-compare Kevin Wolf
2021-02-26 19:46   ` Eric Blake
2021-02-24 13:52 ` [PATCH v2 14/31] qapi/qom: Add ObjectOptions for filter-* Kevin Wolf
2021-02-26 20:03   ` Eric Blake
2021-02-24 13:52 ` [PATCH v2 15/31] qapi/qom: Add ObjectOptions for pr-manager-helper Kevin Wolf
2021-02-26 20:04   ` Eric Blake
2021-02-24 13:52 ` [PATCH v2 16/31] qapi/qom: Add ObjectOptions for confidential-guest-support Kevin Wolf
2021-02-24 15:21   ` Dr. David Alan Gilbert
2021-02-24 16:25     ` Kevin Wolf
2021-02-26 20:27   ` Eric Blake
2021-02-24 13:52 ` [PATCH v2 17/31] qapi/qom: Add ObjectOptions for input-* Kevin Wolf
2021-02-26 20:55   ` Eric Blake
2021-03-02 18:42     ` Kevin Wolf
2021-02-24 13:52 ` [PATCH v2 18/31] qapi/qom: Add ObjectOptions for x-remote-object Kevin Wolf
2021-02-26 21:01   ` Eric Blake
2021-02-24 13:52 ` [PATCH v2 19/31] qapi/qom: QAPIfy object-add Kevin Wolf
2021-02-26 11:30   ` Paolo Bonzini
2021-03-01 11:54     ` Kevin Wolf
2021-03-01 12:03       ` Paolo Bonzini
2021-02-26 21:18   ` Eric Blake
2021-03-02 18:54     ` Kevin Wolf
2021-02-24 13:52 ` [PATCH v2 20/31] qom: Make "object" QemuOptsList optional Kevin Wolf
2021-02-26 21:20   ` Eric Blake
2021-02-24 13:52 ` [PATCH v2 21/31] qemu-storage-daemon: Implement --object with qmp_object_add() Kevin Wolf
2021-02-26 21:22   ` Eric Blake
2021-02-24 13:52 ` [PATCH v2 22/31] qom: Remove user_creatable_add_dict() Kevin Wolf
2021-02-26 21:23   ` Eric Blake
2021-02-24 13:52 ` [PATCH v2 23/31] qom: Factor out user_creatable_process_cmdline() Kevin Wolf
2021-02-26 21:26   ` Eric Blake
2021-02-24 13:52 ` [PATCH v2 24/31] qemu-io: Use user_creatable_process_cmdline() for --object Kevin Wolf
2021-02-26 21:27   ` Eric Blake
2021-02-24 13:52 ` [PATCH v2 25/31] qemu-img: " Kevin Wolf
2021-02-26 21:56   ` Eric Blake
2021-02-26 22:17     ` Eric Blake [this message]
2021-02-24 13:52 ` [PATCH v2 26/31] qemu-nbd: " Kevin Wolf
2021-02-26 22:18   ` Eric Blake
2021-02-24 13:52 ` [PATCH v2 27/31] qom: Add user_creatable_add_from_str() Kevin Wolf
2021-02-26 22:21   ` Eric Blake
2021-03-02 19:39     ` Kevin Wolf
2021-02-24 13:52 ` [PATCH v2 28/31] hmp: QAPIfy object_add Kevin Wolf
2021-02-24 15:31   ` Dr. David Alan Gilbert
2021-02-26 22:23   ` Eric Blake
2021-02-24 13:52 ` [PATCH v2 29/31] qom: Add user_creatable_parse_str() Kevin Wolf
2021-02-26 22:24   ` Eric Blake
2021-02-24 13:52 ` [PATCH v2 30/31] vl: QAPIfy -object Kevin Wolf
2021-02-26 22:40   ` Eric Blake
2021-02-24 13:52 ` [PATCH v2 31/31] qom: Drop QemuOpts based interfaces Kevin Wolf
2021-02-26 22:42   ` Eric Blake
2021-02-24 16:01 ` [PATCH v2 00/31] qapi/qom: QAPIfy --object and object-add Peter Krempa

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=d0bec2d3-ee92-a3c8-d39a-c2569ac433b6@redhat.com \
    --to=eblake@redhat.com \
    --cc=dgilbert@redhat.com \
    --cc=ehabkost@redhat.com \
    --cc=jasowang@redhat.com \
    --cc=kraxel@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=libvir-list@redhat.com \
    --cc=lvivier@redhat.com \
    --cc=mreitz@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=pkrempa@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=thuth@redhat.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.