mirror of https://github.com/xemu-project/xemu.git
Allow mismatched virtio config-len
Commit 'virtio: validate config_len on load' restricted config_len loaded from the wire to match the config_len that the device had. Unfortunately, there are cases where this isn't true, the one we found it on was the wce addition in virtio-blk. Allow mismatched config-lengths: *) If the version on the wire is shorter then fine *) If the version on the wire is longer, load what we have space for and skip the rest. (This is mst@redhat.com's rework of what I originally posted) Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
5f8632d3c3
commit
2f5732e964
|
@ -926,12 +926,18 @@ int virtio_load(VirtIODevice *vdev, QEMUFile *f)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
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);
|
* There are cases where the incoming config can be bigger or smaller
|
||||||
return -1;
|
* than what we have; so load what we have space for, and skip
|
||||||
|
* any excess that's in the stream.
|
||||||
|
*/
|
||||||
|
qemu_get_buffer(f, vdev->config, MIN(config_len, vdev->config_len));
|
||||||
|
|
||||||
|
while (config_len > vdev->config_len) {
|
||||||
|
qemu_get_byte(f);
|
||||||
|
config_len--;
|
||||||
}
|
}
|
||||||
qemu_get_buffer(f, vdev->config, vdev->config_len);
|
|
||||||
|
|
||||||
num = qemu_get_be32(f);
|
num = qemu_get_be32(f);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue