Add qemu_get_counted_string to read a string prefixed by a count byte
and use it in loadvm_state and ram_load. Where ever it's used, check the return and error if it failed. Minor: ram_load was using a 257 byte array for its string, the maximum length is 255 bytes + 0 terminator, so fix to 256 Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com> Reviewed-by: Amit Shah <amit.shah@redhat.com> Reviewed-by: David Gibson <david@gibson.dropbear.id.au> Reviewed-by: Juan Quintela <quintela@redhat.com> Signed-off-by: Juan Quintela <quintela@redhat.com>
This commit is contained in:
parent
5cd8cadae8
commit
b3af1bc9d2
@ -312,4 +312,7 @@ static inline void qemu_get_sbe64s(QEMUFile *f, int64_t *pv)
|
|||||||
{
|
{
|
||||||
qemu_get_be64s(f, (uint64_t *)pv);
|
qemu_get_be64s(f, (uint64_t *)pv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t qemu_get_counted_string(QEMUFile *f, char buf[256]);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -585,3 +585,20 @@ int qemu_put_qemu_file(QEMUFile *f_des, QEMUFile *f_src)
|
|||||||
}
|
}
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get a string whose length is determined by a single preceding byte
|
||||||
|
* A preallocated 256 byte buffer must be passed in.
|
||||||
|
* Returns: len on success and a 0 terminated string in the buffer
|
||||||
|
* else 0
|
||||||
|
* (Note a 0 length string will return 0 either way)
|
||||||
|
*/
|
||||||
|
size_t qemu_get_counted_string(QEMUFile *f, char buf[256])
|
||||||
|
{
|
||||||
|
size_t len = qemu_get_byte(f);
|
||||||
|
size_t res = qemu_get_buffer(f, (uint8_t *)buf, len);
|
||||||
|
|
||||||
|
buf[res] = 0;
|
||||||
|
|
||||||
|
return res == len ? res : 0;
|
||||||
|
}
|
||||||
|
@ -973,8 +973,7 @@ int qemu_loadvm_state(QEMUFile *f)
|
|||||||
while ((section_type = qemu_get_byte(f)) != QEMU_VM_EOF) {
|
while ((section_type = qemu_get_byte(f)) != QEMU_VM_EOF) {
|
||||||
uint32_t instance_id, version_id, section_id;
|
uint32_t instance_id, version_id, section_id;
|
||||||
SaveStateEntry *se;
|
SaveStateEntry *se;
|
||||||
char idstr[257];
|
char idstr[256];
|
||||||
int len;
|
|
||||||
|
|
||||||
trace_qemu_loadvm_state_section(section_type);
|
trace_qemu_loadvm_state_section(section_type);
|
||||||
switch (section_type) {
|
switch (section_type) {
|
||||||
@ -982,9 +981,11 @@ int qemu_loadvm_state(QEMUFile *f)
|
|||||||
case QEMU_VM_SECTION_FULL:
|
case QEMU_VM_SECTION_FULL:
|
||||||
/* Read section start */
|
/* Read section start */
|
||||||
section_id = qemu_get_be32(f);
|
section_id = qemu_get_be32(f);
|
||||||
len = qemu_get_byte(f);
|
if (!qemu_get_counted_string(f, idstr)) {
|
||||||
qemu_get_buffer(f, (uint8_t *)idstr, len);
|
error_report("Unable to read ID string for section %u",
|
||||||
idstr[len] = 0;
|
section_id);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
instance_id = qemu_get_be32(f);
|
instance_id = qemu_get_be32(f);
|
||||||
version_id = qemu_get_be32(f);
|
version_id = qemu_get_be32(f);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user