Hi

On Tue, Feb 2, 2021 at 5:02 PM Priyankar Jain <priyankar.j...@nutanix.com>
wrote:

> This commit fixes an issue where migration is failing in the load phase
> because of a false alarm about data unavailability.
>
> Following is the error received when the amount of data to be transferred
> exceeds the default buffer size setup by G_BUFFERED_INPUT_STREAM(4KiB),
> even when the maximum data size supported by this backend is 1MiB
> (DBUS_VMSTATE_SIZE_LIMIT):
>
>   dbus_vmstate_post_load: Invalid vmstate size: 4364
>   qemu-kvm: error while loading state for instance 0x0 of device
> 'dbus-vmstate/dbus-vmstate'
>
> This commit sets the size of the input stream buffer used during load to
> DBUS_VMSTATE_SIZE_LIMIT which is the maximum amount of data a helper can
> send during save phase.
> Secondly, this commit makes sure that the input stream buffer is loaded
> before
> checking the size of the data available in it, rectifying the false alarm
> about
> data unavailability.
>
> Signed-off-by: Priyankar Jain <priyankar.j...@nutanix.com>
>

Fixes: 5010cec2bc87 ("Add dbus-vmstate object")
Reviewed-by: Marc-André Lureau <marcandre.lur...@redhat.com>


---
>  backends/dbus-vmstate.c | 20 +++++++++++++++++---
>  1 file changed, 17 insertions(+), 3 deletions(-)
>
> diff --git a/backends/dbus-vmstate.c b/backends/dbus-vmstate.c
> index bd050e8..3b8a116 100644
> --- a/backends/dbus-vmstate.c
> +++ b/backends/dbus-vmstate.c
> @@ -204,6 +204,8 @@ static int dbus_vmstate_post_load(void *opaque, int
> version_id)
>      m = g_memory_input_stream_new_from_data(self->data, self->data_size,
> NULL);
>      s = g_data_input_stream_new(m);
>      g_data_input_stream_set_byte_order(s,
> G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN);
> +    g_buffered_input_stream_set_buffer_size(G_BUFFERED_INPUT_STREAM(s),
> +                                            DBUS_VMSTATE_SIZE_LIMIT);
>
>      nelem = g_data_input_stream_read_uint32(s, NULL, &err);
>      if (err) {
> @@ -241,11 +243,23 @@ static int dbus_vmstate_post_load(void *opaque, int
> version_id)
>          }
>
>          len = g_data_input_stream_read_uint32(s, NULL, &err);
> +        if (len > DBUS_VMSTATE_SIZE_LIMIT) {
> +            error_report("%s: Invalid vmstate size: %u", __func__, len);
> +            return -1;
> +        }
> +
> +        g_buffered_input_stream_fill(G_BUFFERED_INPUT_STREAM(s), len,
> NULL,
> +                                     &err);
> +        if (err) {
> +            goto error;
> +        }
> +
>          avail = g_buffered_input_stream_get_available(
>              G_BUFFERED_INPUT_STREAM(s));
> -
> -        if (len > DBUS_VMSTATE_SIZE_LIMIT || len > avail) {
> -            error_report("%s: Invalid vmstate size: %u", __func__, len);
> +        if (len > avail) {
> +            error_report("%s: Not enough data available to load for Id:
> '%s'. "
> +                "Available data size: %lu, Actual vmstate size: %u",
> +                __func__, id, avail, len);
>              return -1;
>          }
>
> --
> 1.8.3.1
>
>

Reply via email to