cutils: Fix wraparound parsing in qemu_strtoui
commit56ddafde3f68b27123281dde3f48b5e945c86b48
authorEric Blake <eblake@redhat.com>
Mon, 22 May 2023 19:04:27 +0000 (22 14:04 -0500)
committerEric Blake <eblake@redhat.com>
Fri, 2 Jun 2023 17:23:33 +0000 (2 12:23 -0500)
tree4a93c5cc0a51d72b3e0bff236695902cf1c0ee52
parent3069522bb9db4586262cbbbf447c5c5211d5921d
cutils: Fix wraparound parsing in qemu_strtoui

While we were matching 32-bit strtol in qemu_strtoi, our use of a
64-bit parse was leaking through for some inaccurate answers in
qemu_strtoui in comparison to a 32-bit strtoul (see the unit test for
examples).  The comment for that function even described what we have
to do for a correct parse, but didn't implement it correctly: since
strtoull checks for overflow against the wrong values and then
negates, we have to temporarily undo negation before checking for
overflow against our desired value.

Our int wrappers would be a lot easier to write if libc had a
guaranteed 32-bit parser even on platforms with 64-bit long.

Whether we parse C2x binary strings like "0b1000" is currently up to
what libc does; our unit tests intentionally don't cover that at the
moment, though.

Fixes: 473a2a331e ("cutils: add qemu_strtoi & qemu_strtoui parsers for int/unsigned int types", v2.12.0)
Signed-off-by: Eric Blake <eblake@redhat.com>
CC: qemu-stable@nongnu.org
Message-Id: <20230522190441.64278-6-eblake@redhat.com>
Reviewed-by: Hanna Czenczek <hreitz@redhat.com>
tests/unit/test-cutils.c
util/cutils.c