|
| From: | John Snow |
| Subject: | Re: [Qemu-devel] [PATCH v2] virtio-rng: Add human-readable error message for negative max-bytes parameter |
| Date: | Fri, 18 Jul 2014 17:14:56 -0400 |
| User-agent: | Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.6.0 |
|
On 07/18/2014 09:16 AM, Markus
Armbruster wrote:
OK, so I took a peek at how this value comes into being and it's via set_uint64 --> visit_type_uint64 --> parse_type_int.Amit Shah <address@hidden> writes:On (Fri) 18 Jul 2014 [13:54:01], Markus Armbruster wrote:Amit Shah <address@hidden> writes:On (Fri) 18 Jul 2014 [13:15:18], Markus Armbruster wrote:Amit Shah <address@hidden> writes:On (Fri) 18 Jul 2014 [08:27:59], Markus Armbruster wrote:John Snow <address@hidden> writes:If a negative integer is used for the max_bytes parameter, QEMU currently calls abort() and leaves behind a core dump. This patch adds a simple error message to make the reason for the termination clearer. Signed-off-by: John Snow <address@hidden> --- v2: Changed 0L constant to (uint64_t)0 constant to match PRId64 format code on both 32bit and 64bit systems. Tested via -m32 flag. hw/virtio/virtio-rng.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/hw/virtio/virtio-rng.c b/hw/virtio/virtio-rng.c index 1356aca..64c7d23 100644 --- a/hw/virtio/virtio-rng.c +++ b/hw/virtio/virtio-rng.c @@ -181,7 +181,11 @@ static void virtio_rng_device_realize(DeviceState *dev, Error **errp) vrng->vq = virtio_add_queue(vdev, 8, handle_input); - assert(vrng->conf.max_bytes <= INT64_MAX); + if (vrng->conf.max_bytes > INT64_MAX) { + error_set(errp, QERR_PROPERTY_VALUE_OUT_OF_RANGE, "virtio-rng", + "max_bytes", vrng->conf.max_bytes, (uint64_t)0, INT64_MAX);Missed this initially: the property name is "max-bytes", not "max_bytes". Please fix. visit_type_uint32 has a boundary check where it makes sure that the value given to it is within its range, though it will still convert negatives "automatically" and depending on the negative given, it might pass this range check. visit_type_uint64 by contrast cannot perform a check since everything is within range by definition. Both of these calls ultimately rely on parse_type_int to do their dirty work, which they are configured to do so via string_input_visitor_new, where we create the visitor object which defines which parsing routines to use -- we only bother setting type_int. The visitor pattern in-use here does not currently allow for a "generic" unsigned version (type_uint), but it does offer us uint8, uint16, uint32 and uint64. It might be worth setting these fields to point to a new parse_type_uint helper that throws an error if it encounters a negative instead of deftly converting against our wishes. This would trickle up to every property that uses unsigned types. This way, there would never be any implicit conversion of negative integers to large, unsigned integers. This would fix the semantic issue that Markus has pointed out wherein we requested an unsigned integer, but we may have already been passed a signed integer. Tightening the integer parsing might help make parsing more semantically meaningful. Another option might be to somehow leave a breadcrumb somewhere in the StringInputVisitor object that informs the parse_type_int/parse_str functions ultimately that we'd like to be strict about enforcing a "no sign modifiers" policy for this parsing. I am not well familiar enough with the properties regime as a whole to really recommend where we might inject such a bool. Of course, this would have to be a 2.2+ fix. For 2.1, I might just stick with my original plan and make the error message nicer. Thoughts? --j |
| [Prev in Thread] | Current Thread | [Next in Thread] |