On 03/21/2017 11:49 AM, Markus Armbruster wrote: > > QMP clients that work around the "large positive integers are rejected" > bugs by sending large negative ones instead may well exist. Fixing the > interface would break them. Depressing. Eric, could you have a peek at > libvirt?
Yes, libvirt is such a client already. From
util/virjson.c:virJSONValueObjectAddVArgs():
* Adds the key-value pairs supplied as variable argument list to @obj.
*
* Keys look like s:name the first letter is a type code:
...
* U: unsigned long integer value (see below for quirks)
* P: unsigned long integer value, omitted if zero
...
case 'P':
case 'U': {
/* qemu silently truncates numbers larger than LLONG_MAX,
* so passing the full range of unsigned 64 bit integers
* is not safe here. Pass them as signed 64 bit integers
* instead.
*/
long long val = va_arg(args, long long);
if (!val && type == 'P')
continue;
rc = virJSONValueObjectAppendNumberLong(obj, key, val);
} break;
So if we "fix" QMP to reject negative values in place of large unsigned
values, we'll need to also fix libvirt to have a way to introspect the
difference and cope accordingly. (I'm thinking that we'll have to keep
the negative parsing indefinitely, and can merely improve the parser to
also parse large positive - but that we can still reject values <
INT64_MIN that would have a weird wraparound).
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
signature.asc
Description: OpenPGP digital signature
