From: Markus Armbruster <armbru@redhat.com>
To: David Hildenbrand <david@redhat.com>
Cc: Eduardo Habkost <ehabkost@redhat.com>,
"Michael S . Tsirkin" <mst@redhat.com>,
Michael Roth <mdroth@linux.vnet.ibm.com>,
qemu-devel@nongnu.org, Igor Mammedov <imammedo@redhat.com>,
"Dr . David Alan Gilbert" <dgilbert@redhat.com>,
David Gibson <david@gibson.dropbear.id.au>
Subject: Re: [Qemu-devel] [PATCH v3 1/7] qapi: use qemu_strtoi64() in parse_str
Date: Wed, 31 Oct 2018 18:55:12 +0100 [thread overview]
Message-ID: <875zxingqn.fsf@dusky.pond.sub.org> (raw)
In-Reply-To: <e8fe86a1-d075-2ea8-d1f4-e08e5dceee07@redhat.com> (David Hildenbrand's message of "Wed, 31 Oct 2018 17:47:13 +0100")
David Hildenbrand <david@redhat.com> writes:
> On 31.10.18 15:40, Markus Armbruster wrote:
>> David Hildenbrand <david@redhat.com> writes:
>>
>>> The qemu api claims to be easier to use, and the resulting code seems to
>>> agree.
[...]
>>> @@ -60,9 +61,7 @@ static int parse_str(StringInputVisitor *siv, const char *name, Error **errp)
>>> }
>>>
>>> do {
>>> - errno = 0;
>>> - start = strtoll(str, &endptr, 0);
>>> - if (errno == 0 && endptr > str) {
>>> + if (!qemu_strtoi64(str, &endptr, 0, &start)) {
>>> if (*endptr == '\0') {
>>> cur = g_malloc0(sizeof(*cur));
>>> range_set_bounds(cur, start, start);
>>> @@ -71,11 +70,7 @@ static int parse_str(StringInputVisitor *siv, const char *name, Error **errp)
>>> str = NULL;
>>> } else if (*endptr == '-') {
>>> str = endptr + 1;
>>> - errno = 0;
>>> - end = strtoll(str, &endptr, 0);
>>> - if (errno == 0 && endptr > str && start <= end &&
>>> - (start > INT64_MAX - 65536 ||
>>> - end < start + 65536)) {
>>> + if (!qemu_strtoi64(str, &endptr, 0, &end) && start < end) {
>>
>> You deleted (start > INT64_MAX - 65536 || end < start + 65536). Can you
>> explain that to me? I'm feeling particularly dense today...
>
> qemu_strtoi64 performs all different kinds of error handling completely
> internally. This old code here was an attempt to filter out -EWHATEVER
> from the response. No longer needed as errors and the actual value are
> reported via different ways.
I understand why errno == 0 && endptr > str go away. They also do in
the previous hunk.
The deletion of (start > INT64_MAX - 65536 || end < start + 65536) is
unobvious. What does it do before the patch?
The condition goes back to commit 659268ffbff, which predates my watch
as maintainer. Its commit message is of no particular help. Its code
is... allright, the less I say about that, the better.
We're parsing a range here. We already parsed its lower bound into
@start (and guarded against errors), and its upper bound into @end (and
guarded against errors).
If the condition you delete is false, we goto error. So the condition
is about range validity. I figure it's an attempt to require valid
ranges to be no "wider" than 65535. The second part end < start + 65536
checks exactly that, except shit happens when start + 65536 overflows.
The first part attempts to guard against that, but
(1) INT64_MAX is *wrong*, because we compute in long long, and
(2) it rejects even small ranges like INT64_MAX - 2 .. INT64_MAX - 1.
WTF?!?
Unless I'm mistaken, the condition is not about handling any of the
errors that qemu_strtoi64() handles for us.
The easiest way for you out of this morass is probably to keep the
condition exactly as it was, then use the "my patch doesn't make things
any worse" get-out-of-jail-free card.
next prev parent reply other threads:[~2018-10-31 17:55 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-10-23 15:22 [Qemu-devel] [PATCH v3 0/7] qapi/range/memory-device: fixes and cleanups David Hildenbrand
2018-10-23 15:23 ` [Qemu-devel] [PATCH v3 1/7] qapi: use qemu_strtoi64() in parse_str David Hildenbrand
2018-10-25 14:37 ` David Gibson
2018-10-31 14:40 ` Markus Armbruster
2018-10-31 16:47 ` David Hildenbrand
2018-10-31 17:55 ` Markus Armbruster [this message]
2018-10-31 18:01 ` David Hildenbrand
2018-11-05 15:37 ` Markus Armbruster
2018-11-05 15:53 ` David Hildenbrand
2018-11-05 16:48 ` Eric Blake
2018-11-06 9:20 ` David Hildenbrand
2018-11-05 20:43 ` Markus Armbruster
2018-11-06 9:19 ` David Hildenbrand
2018-11-07 15:29 ` Markus Armbruster
2018-11-07 20:02 ` David Hildenbrand
2018-11-08 8:39 ` Markus Armbruster
2018-11-08 8:54 ` David Hildenbrand
2018-11-08 9:13 ` Markus Armbruster
2018-11-08 13:05 ` David Hildenbrand
2018-11-08 14:36 ` Markus Armbruster
2018-11-08 14:46 ` David Hildenbrand
2018-11-08 14:42 ` Eric Blake
2018-11-08 14:49 ` David Hildenbrand
2018-10-23 15:23 ` [Qemu-devel] [PATCH v3 2/7] qapi: correctly parse uint64_t values from strings David Hildenbrand
2018-10-25 14:41 ` David Gibson
2018-10-26 12:48 ` David Hildenbrand
2018-10-31 14:32 ` Markus Armbruster
2018-10-31 14:44 ` Markus Armbruster
2018-10-31 17:19 ` David Hildenbrand
2018-10-31 17:18 ` David Hildenbrand
2018-11-04 3:27 ` David Gibson
2018-10-23 15:23 ` [Qemu-devel] [PATCH v3 3/7] range: pass const pointer where possible David Hildenbrand
2018-10-25 14:41 ` David Gibson
2018-10-23 15:23 ` [Qemu-devel] [PATCH v3 4/7] range: add some more functions David Hildenbrand
2018-11-01 10:00 ` Igor Mammedov
2018-11-01 10:29 ` David Hildenbrand
2018-11-01 11:05 ` Igor Mammedov
2018-11-05 10:30 ` David Hildenbrand
2018-10-23 15:23 ` [Qemu-devel] [PATCH v3 5/7] memory-device: use QEMU_IS_ALIGNED David Hildenbrand
2018-10-25 14:44 ` David Gibson
2018-10-23 15:23 ` [Qemu-devel] [PATCH v3 6/7] memory-device: avoid overflows on very huge devices David Hildenbrand
2018-10-25 14:44 ` David Gibson
2018-10-25 14:45 ` Igor Mammedov
2018-10-23 15:23 ` [Qemu-devel] [PATCH v3 7/7] memory-device: rewrite address assignment using ranges David Hildenbrand
2018-11-12 14:07 ` David Hildenbrand
2018-11-13 12:26 ` Igor Mammedov
2018-11-13 12:41 ` David Hildenbrand
2018-11-13 13:01 ` [Qemu-devel] [PATCH v4] " David Hildenbrand
2018-10-31 10:14 ` [Qemu-devel] [PATCH v3 0/7] qapi/range/memory-device: fixes and cleanups David Hildenbrand
2018-10-31 19:43 ` Eduardo Habkost
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=875zxingqn.fsf@dusky.pond.sub.org \
--to=armbru@redhat.com \
--cc=david@gibson.dropbear.id.au \
--cc=david@redhat.com \
--cc=dgilbert@redhat.com \
--cc=ehabkost@redhat.com \
--cc=imammedo@redhat.com \
--cc=mdroth@linux.vnet.ibm.com \
--cc=mst@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.