"org.qemu.VMState1",
NULL, err);
if (!proxy) {
- return NULL;
+ if (err != NULL && *err != NULL) {
+ warn_report("%s: Failed to create proxy: %s",
+ __func__, (*err)->message);
+ g_clear_error(err);
+ }
+ continue;
}
result = g_dbus_proxy_get_cached_property(proxy, "Id");
if (!result) {
- g_set_error_literal(err, G_IO_ERROR, G_IO_ERROR_FAILED,
- "VMState Id property is missing.");
- return NULL;
+ warn_report("%s: VMState Id property is missing.", __func__);
+ g_clear_object(&proxy);
+ continue;
}
id = g_variant_dup_string(result, &size);
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) {
&bytes_read, NULL, &err)) {
goto error;
}
- g_return_val_if_fail(bytes_read == len, -1);
+ if (bytes_read != len) {
+ error_report("%s: Short read", __func__);
+ return -1;
+ }
id[len] = 0;
trace_dbus_vmstate_loading(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: %zu, Actual vmstate size: %u",
+ __func__, id, avail, len);
return -1;
}
return;
}
- if (vmstate_register(VMSTATE_IF(self), VMSTATE_INSTANCE_ID_ANY,
- &dbus_vmstate, self) < 0) {
+ if (vmstate_register_any(VMSTATE_IF(self), &dbus_vmstate, self) < 0) {
error_setg(errp, "Failed to register vmstate");
}
}