On 09/04/14 21:30, Eric Blake wrote:
On 09/04/2014 09:39 AM, Peter Krempa wrote:
> On 08/31/14 06:02, Eric Blake wrote:
>> Another layer of overly-multiplexed code that deserves to be
>> split into obviously separate paths for query vs. modify.
>> This continues the cleanup started in the previous patch.
>>
>> In the process, make some tweaks to simplify the logic when
>> parsing the JSON reply. There should be no user-visible
>> semantic changes.
>>
>> +int qemuMonitorBlockJobInfo(qemuMonitorPtr mon,
>> + const char *device,
>> + virDomainBlockJobInfoPtr info)
>> + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
>
> Implementation of this function doesn't check for presence of the @info
> structure and dereferences it always. You should mark argument 3 nonnull
> too.
Good catch.
>> - for (i = 0; i < nr_results; i++) {
>> + for (i = 0, ret = 0; i < nr_results && ret == 0; i++) {
>> virJSONValuePtr entry = virJSONValueArrayGet(data, i);
>> if (!entry) {
>> virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
>> _("missing array element"));
>> - return -1;
>> + ret = -1;
>> + goto cleanup;
>> }
>> - if (qemuMonitorJSONGetBlockJobInfoOne(entry, device, info) == 0)
>> - return 1;
>> + ret = qemuMonitorJSONGetBlockJobInfoOne(entry, device, info);
>
> This doesn't break the loop, thus if the device info isn't last in the
> structure you'd overwrite the return code. I presume the clients don't
> check that far but you've documented that semantics.
Actually, the loop DOES break, just on the next iteration. I added '&&
ret == 0' to the loop continuation condition. So the semantics are:
InfoOne fails and returns -1, the next iteration is aborted and overall
ret is -1
InfoOne returns 0 because the requested device didn't match, so the loop
continues to look at the next array member. If all array members are
exhausted, ret remains 0 and overall return is 0 for job not found.
InfoOne succeeds and returns 1, the next iteration is aborted and the
overall ret is 1 for info populated.
I actually figured out that you probably changed the loop condition when
I walked out of the office :D Unfortunately I wasn't around a computer
to verify and correct myself.
ACK to the original patch if you add ATTRIBUTE_NONNUL to the correct places.
Peter