On 10/25/2016 12:13 PM, Dr. David Alan Gilbert wrote:
[..]
>> for (i = 0; i < n_elems; i++) {
>> - void *addr = base_addr + size * i;
>> + void *curr_elem = first_elem + size * i;
>
> This diff is quite confusing because a lot of it involves the
> rename of 'addr' to 'curr_elem' at the same time as you change
> the structure. It would be better to split the renaming into
> a separate patch to make this clearer or just leave the name
> the same.
>
You are absolutely right this is a Frankestein of a cleanup
patch and the actual patch. I will split the cleanup out.
The patch is also conceptually based on my remove .start patch
it's just that I wanted to make the RFC independent so it can
be tested more easily.
[..]
>> @@ -720,6 +722,27 @@ const VMStateInfo vmstate_info_uint64 = {
>> .put = put_uint64,
>> };
>>
>> +static int get_nullptr(QEMUFile *f, void *pv, size_t size)
>> +{
>> + int8_t tmp;
>> + qemu_get_s8s(f, &tmp);
>> + assert(tmp == 0);
>
> There's no need for the assert there, just return -EINVAL,
> then we'll get a clear error.
Will do.
> Also, '0' is a bad value to use just as a check - if the field is wrong then
> 0 often appears in the next byte anyway;
>
Absolutely right. How about -1?
> However, I'm not sure it's worth having the info_nullptr;
> if we just leave out the whole info_nullptr then you should still
> be protected by the section footer, although this may be
> able to give a better error.
>
IMHO this can (in some cases) guard against the case we have the
same number of elements on source and on target, but at different
positions (e.g. {ptr0, NULL, NULL} and {NULL, ptr1, NULL}. The footers
should not be able to detect this.
Thank you very much for the thorough review! I will wait a bit
to see if more discussion happens, and then send out a non RFC
version with the issues addressed.
Halil