virtio: validate config_len on load
Malformed input can have config_len in migration stream exceed the array size allocated on destination, the result will be heap overflow. To fix, that config_len matches on both sides. CVE-2014-0182 Reported-by: "Dr. David Alan Gilbert" <dgilbert@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Juan Quintela <quintela@redhat.com> -- v2: use %ix and %zx to print config_len values Signed-off-by: Juan Quintela <quintela@redhat.com>
This commit is contained in:
parent
98f93ddd84
commit
a890a2f913
|
@ -898,6 +898,7 @@ int virtio_set_features(VirtIODevice *vdev, uint32_t val)
|
||||||
int virtio_load(VirtIODevice *vdev, QEMUFile *f)
|
int virtio_load(VirtIODevice *vdev, QEMUFile *f)
|
||||||
{
|
{
|
||||||
int i, ret;
|
int i, ret;
|
||||||
|
int32_t config_len;
|
||||||
uint32_t num;
|
uint32_t num;
|
||||||
uint32_t features;
|
uint32_t features;
|
||||||
uint32_t supported_features;
|
uint32_t supported_features;
|
||||||
|
@ -924,7 +925,12 @@ int virtio_load(VirtIODevice *vdev, QEMUFile *f)
|
||||||
features, supported_features);
|
features, supported_features);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
vdev->config_len = qemu_get_be32(f);
|
config_len = qemu_get_be32(f);
|
||||||
|
if (config_len != vdev->config_len) {
|
||||||
|
error_report("Unexpected config length 0x%x. Expected 0x%zx",
|
||||||
|
config_len, vdev->config_len);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
qemu_get_buffer(f, vdev->config, vdev->config_len);
|
qemu_get_buffer(f, vdev->config, vdev->config_len);
|
||||||
|
|
||||||
num = qemu_get_be32(f);
|
num = qemu_get_be32(f);
|
||||||
|
|
Loading…
Reference in a new issue