__virtio_set_bit(vdev, VIRTIO_F_RING_RESET);
 }
 
+static int __vp_check_common_size_one_feature(struct virtio_device *vdev, u32 fbit,
+                                           u32 offset, const char *fname)
+{
+       struct virtio_pci_device *vp_dev = to_vp_device(vdev);
+
+       if (!__virtio_test_bit(vdev, fbit))
+               return 0;
+
+       if (likely(vp_dev->mdev.common_len >= offset))
+               return 0;
+
+       dev_err(&vdev->dev,
+               "virtio: common cfg size(%zu) does not match the feature %s\n",
+               vp_dev->mdev.common_len, fname);
+
+       return -EINVAL;
+}
+
+#define vp_check_common_size_one_feature(vdev, fbit, field) \
+       __vp_check_common_size_one_feature(vdev, fbit, \
+               offsetofend(struct virtio_pci_modern_common_cfg, field), #fbit)
+
+static int vp_check_common_size(struct virtio_device *vdev)
+{
+       if (vp_check_common_size_one_feature(vdev, VIRTIO_F_NOTIF_CONFIG_DATA, queue_notify_data))
+               return -EINVAL;
+
+       if (vp_check_common_size_one_feature(vdev, VIRTIO_F_RING_RESET, queue_reset))
+               return -EINVAL;
+
+       return 0;
+}
+
 /* virtio config->finalize_features() implementation */
 static int vp_finalize_features(struct virtio_device *vdev)
 {
                return -EINVAL;
        }
 
+       if (vp_check_common_size(vdev))
+               return -EINVAL;
+
        vp_modern_set_features(&vp_dev->mdev, vdev->features);
 
        return 0;
 
        mdev->common = vp_modern_map_capability(mdev, common,
                                      sizeof(struct virtio_pci_common_cfg), 4,
                                      0, sizeof(struct virtio_pci_modern_common_cfg),
-                                     NULL, NULL);
+                                     &mdev->common_len, NULL);
        if (!mdev->common)
                goto err_map_common;
        mdev->isr = vp_modern_map_capability(mdev, isr, sizeof(u8), 1,