]> www.infradead.org Git - users/dwmw2/qemu.git/commitdiff
hw/nubus/nubus-device: Range check 'slot' property
authorPeter Maydell <peter.maydell@linaro.org>
Fri, 30 Aug 2024 17:34:52 +0000 (18:34 +0100)
committerThomas Huth <huth@tuxfamily.org>
Sun, 8 Sep 2024 09:49:49 +0000 (11:49 +0200)
The TYPE_NUBUS_DEVICE class lets the user specify the nubus slot
using an int32 "slot" QOM property.  Its realize method doesn't do
any range checking on this value, which Coverity notices by way of
the possibility that 'nd->slot * NUBUS_SUPER_SLOT_SIZE' might
overflow the 32-bit arithmetic it is using.

Constrain the slot value to be less than NUBUS_SLOT_NB (16).

Resolves: Coverity CID 1464070
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Message-ID: <20240830173452.2086140-4-peter.maydell@linaro.org>
Reviewed-by: Thomas Huth <huth@tuxfamily.org>
Reviewed-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Signed-off-by: Thomas Huth <huth@tuxfamily.org>
hw/nubus/nubus-device.c

index be4cb246966e0f907c125b83a075219a4e7e25a7..26fbcf29a2bbb09fa4e54c54961386b493197638 100644 (file)
@@ -35,6 +35,13 @@ static void nubus_device_realize(DeviceState *dev, Error **errp)
     uint8_t *rom_ptr;
     int ret;
 
+    if (nd->slot < 0 || nd->slot >= NUBUS_SLOT_NB) {
+        error_setg(errp,
+                   "'slot' value %d out of range (must be between 0 and %d)",
+                   nd->slot, NUBUS_SLOT_NB - 1);
+        return;
+    }
+
     /* Super */
     slot_offset = nd->slot * NUBUS_SUPER_SLOT_SIZE;