qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Richard W.M. Jones" <rjones@redhat.com>
To: eblake@redhat.com
Cc: kwolf@redhat.com, mreitz@redhat.com, qemu-block@nongnu.org,
	qemu-devel@nongnu.org
Subject: [Qemu-devel] [PATCH] qemu-io: Reinitialize optind correctly before parsing inner command.
Date: Sun, 30 Dec 2018 18:09:12 +0000	[thread overview]
Message-ID: <20181230180912.14614-2-rjones@redhat.com> (raw)
In-Reply-To: <20181230180912.14614-1-rjones@redhat.com>

On FreeBSD 11.2:

  $ ./qemu-io -f raw -c "aio_write 0 512" "nbd:localhost:10809"
  Parsing error: non-numeric argument, or extraneous/unrecognized suffix -- aio_write

After main option parsing, we reinitialize optind so we can parse each
command.  The error happens when parsing the aio_write command.  After
the aio_write getopt loop, optind == 0 and argv[optind] points to the
command name ("aio_write" in this case).  The code fails because it
tries to parse argv[optind] (which it thinks is the first argument) as
an integer.

In fact optind _starts_ the loop as 0, because we set it to 0.

The FreeBSD manual page says:

  In order to use getopt() to evaluate multiple sets of arguments, or to
  evaluate a single set of arguments multiple times, the variable optreset
  must be set to 1 before the second and each additional set of calls to
  getopt(), and the variable optind must be reinitialized.

(From the rest of the man page it is clear that optind must be
reinitialized to 1).

Unfortunately this conflicts with the glibc man page which says:

  A program that scans multiple argument vectors,  or  rescans  the  same
  vector  more than once, and wants to make use of GNU extensions such as
  '+' and '-' at  the  start  of  optstring,  or  changes  the  value  of
  POSIXLY_CORRECT  between scans, must reinitialize getopt() by resetting
  optind to 0, rather than the traditional value of 1.  (Resetting  to  0
  forces  the  invocation  of  an  internal  initialization  routine that
  rechecks POSIXLY_CORRECT and checks for GNU extensions in optstring.)

Reinitialize optind to either 0 or 1 depending on whether we're using
glibc or not.

I didn't set optreset - it's not present in glibc and it doesn't seem
to make any difference on FreeBSD.

Signed-off-by: Richard W.M. Jones <rjones@redhat.com>
---
 qemu-io-cmds.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/qemu-io-cmds.c b/qemu-io-cmds.c
index 2c39124036..ca4e258579 100644
--- a/qemu-io-cmds.c
+++ b/qemu-io-cmds.c
@@ -114,7 +114,11 @@ static int command(BlockBackend *blk, const cmdinfo_t *ct, int argc,
         }
     }
 
+#ifdef __GNU_LIBRARY__
     optind = 0;
+#else
+    optind = 1;
+#endif
     return ct->cfunc(blk, argc, argv);
 }
 
-- 
2.19.2

  reply	other threads:[~2018-12-30 18:09 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-12-30 18:09 [Qemu-devel] [PATCH] qemu-io: Reinitialize optind correctly before parsing inner command Richard W.M. Jones
2018-12-30 18:09 ` Richard W.M. Jones [this message]
2019-01-02 23:21   ` 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=20181230180912.14614-2-rjones@redhat.com \
    --to=rjones@redhat.com \
    --cc=eblake@redhat.com \
    --cc=kwolf@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 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).