qemu/tests
Eric Blake cf923b783e utils: Improve qemu_strtosz() to have 64 bits of precision
We have multiple clients of qemu_strtosz (qemu-io, the opts visitor,
the keyval visitor), and it gets annoying that edge-case testing is
impacted by implicit rounding to 53 bits of precision due to parsing
with strtod().  As an example posted by Rich Jones:
 $ nbdkit memory $(( 2**63 - 2**30 )) --run \
   'build/qemu-io -f raw "$uri" -c "w -P 3 $(( 2**63 - 2**30 - 512 )) 512" '
 write failed: Input/output error

because 9223372035781033472 got rounded to 0x7fffffffc0000000 which is
out of bounds.

It is also worth noting that our existing parser, by virtue of using
strtod(), accepts decimal AND hex numbers, even though test-cutils
previously lacked any coverage of the latter until the previous patch.
We do have existing clients that expect a hex parse to work (for
example, iotest 33 using qemu-io -c "write -P 0xa 0x200 0x400"), but
strtod() parses "08" as 8 rather than as an invalid octal number, so
we know there are no clients that depend on octal.  Our use of
strtod() also means that "0x1.8k" would actually parse as 1536 (the
fraction is 8/16), rather than 1843 (if the fraction were 8/10); but
as this was not covered in the testsuite, I have no qualms forbidding
hex fractions as invalid, so this patch declares that the use of
fractions is only supported with decimal input, and enhances the
testsuite to document that.

Our previous use of strtod() meant that -1 parsed as a negative; now
that we parse with strtoull(), negative values can wrap around modulo
2^64, so we have to explicitly check whether the user passed in a '-';
and make it consistent to also reject '-0'.  This has the minor effect
of treating negative values as EINVAL (with no change to endptr)
rather than ERANGE (with endptr advanced to what was parsed), visible
in the updated iotest output.

We also had no testsuite coverage of "1.1e0k", which happened to parse
under strtod() but is unlikely to occur in practice; as long as we are
making things more robust, it is easy enough to reject the use of
exponents in a strtod parse.

The fix is done by breaking the parse into an integer prefix (no loss
in precision), rejecting negative values (since we can no longer rely
on strtod() to do that), determining if a decimal or hexadecimal parse
was intended (with the new restriction that a fractional hex parse is
not allowed), and where appropriate, using a floating point fractional
parse (where we also scan to reject use of exponents in the fraction).
The bulk of the patch is then updates to the testsuite to match our
new precision, as well as adding new cases we reject (whether they
were rejected or inadvertently accepted before).

Signed-off-by: Eric Blake <eblake@redhat.com>
Message-Id: <20210211204438.1184395-3-eblake@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
2021-03-08 13:36:12 -06:00
..
acceptance tests/acceptance: allow a "graceful" failing for virtio-gpu test 2021-02-24 11:05:14 +00:00
data qtest/acpi/bios-tables-test: update acpi tables 2021-02-23 10:58:42 -05:00
decode decodetree: Improve identifier matching 2020-09-14 14:23:19 +01:00
docker docker: Bump Fedora images to release 33 2021-02-24 11:05:10 +00:00
fp meson: adjust timeouts for some slower tests 2021-03-06 11:42:57 +01:00
guest-debug chardev: do not use short form boolean options in non-QemuOpts character device descriptions 2021-02-25 15:41:53 +01:00
image-fuzzer
include tests: add missing generated sources to testqapi 2020-10-17 10:45:50 -04:00
keys tests/vm: Add Haiku test based on their vagrant images 2020-11-17 09:45:24 +01:00
migration tests: Rename PAGE_SIZE definitions 2021-01-20 10:46:54 +01:00
multiboot Remove superfluous .gitignore files 2020-10-13 12:48:17 +02:00
perf/block/qcow2
plugin tests/plugin: allow memory plugin to do both inline and callbacks 2021-02-18 08:19:23 +00:00
qapi-schema qapi: Fix parse errors for removal of null from schema language 2021-03-05 15:40:50 +01:00
qemu-iotests utils: Improve qemu_strtosz() to have 64 bits of precision 2021-03-08 13:36:12 -06:00
qtest * fix tracing vs -daemonize (Daniel) 2021-03-08 13:51:41 +00:00
rocker
tcg meson.build: expose TCG cross compiler information in summary 2021-02-24 11:05:05 +00:00
tsan tests/docker: Added docker build support for TSan. 2020-06-16 14:49:05 +01:00
uefi-test-tools Remove superfluous .gitignore files 2020-10-13 12:48:17 +02:00
vm tests/docker, tests/vm: remove setuptools from images 2020-11-25 12:50:48 -05:00
vmstate-static-checker-data
atomic64-bench.c qemu/atomic.h: rename atomic_ to qatomic_ 2020-09-23 16:07:44 +01:00
atomic_add-bench.c qemu/atomic.h: rename atomic_ to qatomic_ 2020-09-23 16:07:44 +01:00
benchmark-crypto-cipher.c tests: fix output message formatting for crypto benchmarks 2020-09-10 11:02:17 +01:00
benchmark-crypto-hash.c tests: fix output message formatting for crypto benchmarks 2020-09-10 11:02:17 +01:00
benchmark-crypto-hmac.c tests: fix output message formatting for crypto benchmarks 2020-09-10 11:02:17 +01:00
check-block-qdict.c tests: Use error_free_or_abort() where appropriate 2020-07-02 06:25:28 +02:00
check-block.sh iotests: rewrite check into python 2021-01-27 20:53:14 +01:00
check-qdict.c
check-qjson.c qobject: Drop qstring_get_try_str() 2020-12-19 10:39:16 +01:00
check-qlist.c qobject: Eliminate qlist_iter(), use QLIST_FOREACH_ENTRY() instead 2020-04-30 06:51:15 +02:00
check-qlit.c
check-qnull.c
check-qnum.c qobject: Fix qnum_to_string() to use sufficient precision 2020-12-19 10:37:16 +01:00
check-qobject.c qobject: Make QString immutable 2020-12-19 10:39:41 +01:00
check-qom-interface.c Use DECLARE_*CHECKER* macros 2020-09-09 09:27:09 -04:00
check-qom-proplist.c qom: Clean up object_property_get_enum()'s error value 2020-09-18 13:49:48 -04:00
check-qstring.c qobject: Make QString immutable 2020-12-19 10:39:41 +01:00
crypto-tls-psk-helpers.c
crypto-tls-psk-helpers.h
crypto-tls-x509-helpers.c tests: Replace deprecated ASN1 code 2021-01-29 17:07:53 +00:00
crypto-tls-x509-helpers.h tests: Replace deprecated ASN1 code 2021-01-29 17:07:53 +00:00
dbus-vmstate-daemon.sh
io-channel-helpers.c test: Fix LGPL information in the file headers 2020-11-15 17:04:40 +01:00
io-channel-helpers.h test: Fix LGPL information in the file headers 2020-11-15 17:04:40 +01:00
iothread.c qemu/atomic.h: rename atomic_ to qatomic_ 2020-09-23 16:07:44 +01:00
iothread.h
Makefile.include tests/Makefile.include: don't use TARGET_DIRS for check-tcg 2021-02-08 10:55:20 +00:00
meson.build meson: adjust timeouts for some slower tests 2021-03-06 11:42:57 +01:00
pkix_asn1_tab.c tests: Replace deprecated ASN1 code 2021-01-29 17:07:53 +00:00
ptimer-test-stubs.c replay: do not build if TCG is not available 2020-10-22 11:53:54 -04:00
ptimer-test.c
ptimer-test.h
qht-bench.c qemu/atomic.h: rename atomic_ to qatomic_ 2020-09-23 16:07:44 +01:00
rcutorture.c qemu/atomic.h: rename atomic_ to qatomic_ 2020-09-23 16:07:44 +01:00
requirements.txt Acceptance Tests: bump Avocado version requirement to 85.0 2021-02-15 18:56:57 -05:00
socket-helpers.c tests/socket-helpers: Treat EAI_NONAME as EADDRNOTAVAIL 2020-09-16 08:41:06 +02:00
socket-helpers.h
test-aio-multithread.c qemu/atomic.h: rename atomic_ to qatomic_ 2020-09-23 16:07:44 +01:00
test-aio.c
test-authz-list.c authz: Fix Lesser GPL version number 2020-10-29 09:57:37 +00:00
test-authz-listfile.c authz: Fix Lesser GPL version number 2020-10-29 09:57:37 +00:00
test-authz-pam.c tests: Fix runtime error in test-authz-pam 2021-01-29 17:07:53 +00:00
test-authz-simple.c authz: Fix Lesser GPL version number 2020-10-29 09:57:37 +00:00
test-base64.c test: Fix LGPL information in the file headers 2020-11-15 17:04:40 +01:00
test-bdrv-drain.c block: End quiescent sections when a BDS is deleted 2020-10-27 15:26:20 +01:00
test-bdrv-graph-mod.c block: use return status of bdrv_append() 2021-02-12 15:39:44 -06:00
test-bitcnt.c
test-bitmap.c mingw: fix error __USE_MINGW_ANSI_STDIO redefined 2020-10-13 13:33:46 +02:00
test-bitops.c
test-block-backend.c
test-block-iothread.c tests: Use error_free_or_abort() where appropriate 2020-07-02 06:25:28 +02:00
test-blockjob-txn.c
test-blockjob.c job: take each job's lock individually in job_txn_apply 2020-04-07 14:34:47 +02:00
test-bufferiszero.c test: Fix LGPL information in the file headers 2020-11-15 17:04:40 +01:00
test-char.c docs: update to show preferred boolean syntax for -chardev 2021-02-25 14:14:33 +01:00
test-clone-visitor.c qapi: Use QAPI_LIST_PREPEND() where possible 2020-12-19 10:20:14 +01:00
test-coroutine.c
test-crypto-afsplit.c crypt: Fix Lesser GPL version number 2020-10-29 09:57:37 +00:00
test-crypto-block.c crypt: Fix Lesser GPL version number 2020-10-29 09:57:37 +00:00
test-crypto-cipher.c crypt: Fix Lesser GPL version number 2020-10-29 09:57:37 +00:00
test-crypto-hash.c crypt: Fix Lesser GPL version number 2020-10-29 09:57:37 +00:00
test-crypto-hmac.c
test-crypto-ivgen.c crypt: Fix Lesser GPL version number 2020-10-29 09:57:37 +00:00
test-crypto-pbkdf.c test: Fix LGPL information in the file headers 2020-11-15 17:04:40 +01:00
test-crypto-secret.c crypt: Fix Lesser GPL version number 2020-10-29 09:57:37 +00:00
test-crypto-tlscredsx509.c
test-crypto-tlssession.c
test-crypto-xts.c crypt: Fix Lesser GPL version number 2020-10-29 09:57:37 +00:00
test-cutils.c utils: Improve qemu_strtosz() to have 64 bits of precision 2021-03-08 13:36:12 -06:00
test-fdmon-epoll.c tests: add test-fdmon-epoll 2020-09-23 13:45:52 +01:00
test-hbitmap.c block/dirty-bitmap: improve _next_dirty_area API 2020-03-18 14:03:46 -04:00
test-image-locking.c
test-int128.c
test-io-channel-buffer.c io: Fix Lesser GPL version number 2020-10-29 09:57:37 +00:00
test-io-channel-command.c io: Fix Lesser GPL version number 2020-10-29 09:57:37 +00:00
test-io-channel-file.c io: Fix Lesser GPL version number 2020-10-29 09:57:37 +00:00
test-io-channel-socket.c io: Fix Lesser GPL version number 2020-10-29 09:57:37 +00:00
test-io-channel-tls.c
test-io-task.c io: Fix Lesser GPL version number 2020-10-29 09:57:37 +00:00
test-iov.c util/iov: add iov_discard_undo() 2020-09-23 13:41:58 +01:00
test-keyval.c utils: Improve qemu_strtosz() to have 64 bits of precision 2021-03-08 13:36:12 -06:00
test-logging.c qemu/atomic.h: rename atomic_ to qatomic_ 2020-09-23 16:07:44 +01:00
test-mul64.c
test-opts-visitor.c
test-qapi-util.c
test-qdev-global-props.c tests: Fixes test-qdev-global-props.c 2020-09-16 12:15:07 +02:00
test-qdist.c
test-qemu-opts.c utils: Improve qemu_strtosz() to have 64 bits of precision 2021-03-08 13:36:12 -06:00
test-qga.c test-qga: fix a resource leak in test_qga_guest_get_osinfo() 2020-12-09 08:04:34 +01:00
test-qgraph.c test: Fix LGPL information in the file headers 2020-11-15 17:04:40 +01:00
test-qht-par.c
test-qht.c
test-qmp-cmds.c qapi: Add a 'coroutine' flag for commands 2020-10-09 07:08:19 +02:00
test-qmp-event.c
test-qobject-input-visitor.c qapi: enable use of g_autoptr with QAPI types 2020-09-03 09:38:36 +02:00
test-qobject-output-visitor.c qapi: Use QAPI_LIST_APPEND in trivial cases 2021-01-28 08:08:45 +01:00
test-rcu-list.c qemu/atomic.h: rename atomic_ to qatomic_ 2020-09-23 16:07:44 +01:00
test-rcu-simpleq.c
test-rcu-slist.c
test-rcu-tailq.c
test-replication.c tests: test-replication disable /replication/secondary/* on msys2/mingw. 2020-09-16 08:41:06 +02:00
test-shift128.c
test-string-input-visitor.c tests: Use &error_abort where appropriate 2020-07-02 06:25:28 +02:00
test-string-output-visitor.c qapi: Use QAPI_LIST_APPEND in trivial cases 2021-01-28 08:08:45 +01:00
test-thread-pool.c qemu/atomic.h: rename atomic_ to qatomic_ 2020-09-23 16:07:44 +01:00
test-throttle.c
test-timed-average.c cpu-timers, icount: new modules 2020-10-05 16:41:22 +02:00
test-util-filemonitor.c tests: Fixes building test-util-filemonitor.c on msys2/mingw 2020-09-07 12:34:17 +02:00
test-util-sockets.c sockets: Make abstract UnixSocketAddress depend on CONFIG_LINUX 2020-11-03 13:17:25 +00:00
test-uuid.c test: Fix LGPL information in the file headers 2020-11-15 17:04:40 +01:00
test-visitor-serialization.c qobject: Change qobject_to_json()'s value to GString 2020-12-19 10:38:43 +01:00
test-vmstate.c vmstate: Fixes test-vmstate.c on msys2/mingw 2020-09-16 08:41:06 +02:00
test-write-threshold.c block: refactor bdrv_check_request: add errp 2021-02-03 08:00:33 -06:00
test-x86-cpuid.c Revert "hw/i386: Update structures to save the number of nodes per package" 2020-09-02 07:29:26 -04:00
test-xbzrle.c tests: Rename PAGE_SIZE definitions 2021-01-20 10:46:54 +01:00
vhost-user-bridge.c libvhost-user: make it a meson subproject 2020-12-08 13:48:58 -05:00