Validate fields loaded from the migration stream to reject crafted or
corrupt data before it can cause harm.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
hw/usb/dev-smartcard-reader.c | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git a/hw/usb/dev-smartcard-reader.c b/hw/usb/dev-smartcard-reader.c
index c6a9faf00d6f..bed641be4512 100644
--- a/hw/usb/dev-smartcard-reader.c
+++ b/hw/usb/dev-smartcard-reader.c
@@ -1364,6 +1364,26 @@ static void ccid_realize(USBDevice *dev, Error **errp)
static int ccid_post_load(void *opaque, int version_id)
{
USBCCIDState *s = opaque;
+ int i;
+
+ if (s->bulk_in_pending_end - s->bulk_in_pending_start > BULK_IN_PENDING_NUM) {
+ return -EINVAL;
+ }
+
+ if (s->pending_answers_num > PENDING_ANSWERS_NUM) {
+ return -EINVAL;
+ }
+
+ if (s->bulk_out_pos > BULK_OUT_DATA_SIZE) {
+ return -EINVAL;
+ }
+
+ for (i = 0; i < BULK_IN_PENDING_NUM; i++) {
+ if (s->bulk_in_pending[i].len > BULK_IN_BUF_SIZE ||
+ s->bulk_in_pending[i].pos > s->bulk_in_pending[i].len) {
+ return -EINVAL;
+ }
+ }
/*
* This must be done after usb_device_attach, which sets state to ATTACHED,
--
2.55.0