From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:60917) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1X9LOE-0000GH-G8 for qemu-devel@nongnu.org; Mon, 21 Jul 2014 17:45:04 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1X9LO6-0005Sf-8r for qemu-devel@nongnu.org; Mon, 21 Jul 2014 17:44:58 -0400 Received: from mx1.redhat.com ([209.132.183.28]:58189) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1X9LO6-0005SR-14 for qemu-devel@nongnu.org; Mon, 21 Jul 2014 17:44:50 -0400 From: John Snow Date: Mon, 21 Jul 2014 17:44:37 -0400 Message-Id: <1405979077-18163-1-git-send-email-jsnow@redhat.com> Subject: [Qemu-devel] [PATCH v3] virtio-rng: Add human-readable error message for negative max-bytes parameter List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: amit.shah@redhat.com, peter.maydell@linaro.org, jsnow@redhat.com, armbru@redhat.com 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. There is an underlying insufficiency in the parameter parsing code of QEMU that renders it unable to reject negative values for unsigned properties, thus the error message "a non-negative integer below 2^63" is the most user-friendly and correct message we can give until the underlying insufficiency is corrected. Signed-off-by: John Snow --- v3: Adjusted the error message to be more semantically meaningful, but while acknowledging the limitations of the current unsigned integer parsing routines. hw/virtio/virtio-rng.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/hw/virtio/virtio-rng.c b/hw/virtio/virtio-rng.c index 1356aca..7c5a675 100644 --- a/hw/virtio/virtio-rng.c +++ b/hw/virtio/virtio-rng.c @@ -181,7 +181,13 @@ 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); + /* Workaround: Property parsing does not enforce unsigned integers, + * So this is a hack to reject such numbers. */ + if (vrng->conf.max_bytes > INT64_MAX) { + error_set(errp, QERR_INVALID_PARAMETER_VALUE, "max-bytes", + "a non-negative integer below 2^63"); + return; + } vrng->quota_remaining = vrng->conf.max_bytes; vrng->rate_limit_timer = timer_new_ms(QEMU_CLOCK_VIRTUAL, -- 1.9.3