qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] qemu: json: Fix parsing of integers >= 0x800000


From: Anthony Liguori
Subject: Re: [Qemu-devel] [PATCH] qemu: json: Fix parsing of integers >= 0x8000000000000000
Date: Mon, 23 May 2011 08:38:15 -0500
User-agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.17) Gecko/20110424 Lightning/1.0b2 Thunderbird/3.1.10

On 05/23/2011 08:04 AM, Daniel P. Berrange wrote:
On Fri, May 20, 2011 at 01:11:05PM -0500, Anthony Liguori wrote:
On 05/20/2011 01:03 PM, Richard W.M. Jones wrote:

There seem to be a few unsafe uses of strto* functions.  This patch
just fixes the one that affects me :-)

Sending an integer of this size is not valid JSON.

Your patch won't accept negative numbers, correct?

JSON only supports int64_t.

That's not really true. JSON supports arbitrarily large numbers
&  integers.

This really blows my mind:

alert(9223372036854775807 == 9223372036854775808);

Regards,

Anthony Liguori

  It is merely the QEMU parser / object model which
is artifically limiting them to int64_t. The core of the problem
is with the QInt implementation in QEMU, which uses an 'int64_t'
as its canonical form, rather than just holding a string representation
of the number. The JSON parser should only validate that the
data is a valid JSON number, and then pass the number as a string
to QInt. The conversion to int_64 or other integer sizes / formats
should be done at time of use, according to the type of data the
command actually wants, whether int64t, int32t, int16t etc. eg the
QInt API should look more like:

   QInt *qint_from_string(const char *number);
   QInt *qint_from_int64(int64_t val);
   QInt *qint_from_int32(int64_t val);
   QInt *qint_from_int16(int64_t val);
   QInt *qint_from_uint64(uint64_t val);
   QInt *qint_from_uint32(uint32_t val);
   QInt *qint_from_uint16(uint16_t val);

   int qint_get_int64(QInt *qi, int64t *val);
   int qint_get_int32(QInt *qi, int32t *val);
   int qint_get_int16(QInt *qi, int16t *val);
   int qint_get_uint64(QInt *qi, uint64t *val);
   int qint_get_uint32(QInt *qi, uint32t *val);
   int qint_get_uint16(QInt *qi, uint16t *val);


Regards,
Daniel




reply via email to

[Prev in Thread] Current Thread [Next in Thread]