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

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to